Eva*_*oll 7 sql-server order-by sql-server-2008-r2 case
使用 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;
Run Code Online (Sandbox Code Playgroud)
在我的生产查询中,左查询需要按[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
Run Code Online (Sandbox Code Playgroud)
Mar*_*ith 12
如果在 中使用别名,则ORDER BY
它必须单独使用,而不是在表达式中使用。
如果在任何类型的表达式中,它会尝试将其解析为基表源中的列而不是别名。
所以例如
SELECT A AS B
FROM (VALUES (1, 3),
(2, 2),
(3, 1)) V(A, B)
ORDER BY B
Run Code Online (Sandbox Code Playgroud)
退货(按别名排序)
+---+
| B |
+---+
| 1 |
| 2 |
| 3 |
+---+
Run Code Online (Sandbox Code Playgroud)
但
SELECT A AS B
FROM (VALUES (1, 3),
(2, 2),
(3, 1)) V(A, B)
ORDER BY B + 0
Run Code Online (Sandbox Code Playgroud)
返回(按基表列排序B
)
+---+
| B |
+---+
| 3 |
| 2 |
| 1 |
+---+
Run Code Online (Sandbox Code Playgroud)
您当然可以将整个内容包装在派生表或 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;
Run Code Online (Sandbox Code Playgroud)