Sql-Server
ORDER BY 項目必須出現在選擇列表中………
使用 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;