Sql-Server

ORDER BY 項目必須出現在選擇列表中………

  • July 30, 2013

使用 Microsoft SQL Server 2008,我收到以下錯誤。

如果語句包含 UNION、INTERSECT 或 EXCEPT 運算符,則消息 104、級別 16、狀態 1、第 43 行 ORDER BY 項必須出現在選擇列表中。

我使用的查詢有點複雜,但是子句CASE旁邊的語句ORDER BY看不到別名列名,這裡是一個簡單的例子。

SELECT 1 AS foo, 2 AS bar
UNION ALL
SELECT 10 AS foo, 20 AS bar
ORDER BY CASE WHEN foo = 2 THEN 1 END;

在我的生產查詢中,左查詢需要按[360_set]在表中找到的列排序,而右查詢需要按[360_set]為空的方式排序。

如何修復此錯誤,為什麼此語法會生成錯誤?

這是版本資訊,

Microsoft SQL Server Management Studio     10.0.5512.0
Microsoft Analysis Services Client Tools   10.0.5500.0
Microsoft Data Access Components (MDAC)    6.1.7601.17514
Microsoft MSXML                            3.0 6.0 
Microsoft Internet Explorer                9.10.9200.16635
Microsoft .NET Framework                   2.0.50727.5472
Operating System                           6.1.7601

如果在 an 中使用別名,ORDER BY則必須單獨使用它,而不是在表達式中使用。

如果在任何類型的表達式中,它會嘗試將其解析為基表源中的列而不是別名。

所以例如

SELECT A AS B
FROM   (VALUES (1, 3),
              (2, 2),
              (3, 1)) V(A, B)
ORDER  BY B

返回(按別名排序)

+---+
| B |
+---+
| 1 |
| 2 |
| 3 |
+---+

SELECT A AS B
FROM   (VALUES (1, 3),
              (2, 2),
              (3, 1)) V(A, B)
ORDER  BY B + 0 

返回(按基表列排序B

+---+
| B |
+---+
| 3 |
| 2 |
| 1 |
+---+

您當然可以將整個內容包裝在派生表或 CTE 中。

WITH T AS
(
SELECT 1 AS foo, 2 AS bar
UNION ALL
SELECT 10 AS foo, 20 AS bar
)
SELECT *
FROM T
ORDER BY CASE WHEN foo = 1 THEN bar END;

引用自:https://dba.stackexchange.com/questions/47314