【发布时间】:2020-11-23 16:56:11
【问题描述】:
我试图在 ORDER BY 中引用列名。我被难住了,把头发拉出来 b/c 我知道我以前做过这个,但我不记得了,我在搜索时找不到答案。
SELECT 2, LFEA_TYPE, LFEA_TITLE, LFEA_CHECKED, LFEA_VALUE, LFEA_PARAGRAPH FROM LFEA WHERE LFEA_LIS_ID = 230130 UNION SELECT 1, 'ACCOM', 'Air Conditioning', 'Y', LIS_AC_TEXT, NULL FROM LIS WHERE LIS_ID = 230130 ORDER BY 1 ASC, 2 ASC, 4 DESC, 5 DESC, CASE WHEN (LFEA_PARAGRAPH IS NOT NULL AND LFEA_PARAGRAPH <> '') THEN 2 ELSE 1 END ASC
这是一个非常基本的查询,但我收到了:
ORDER BY items must appear in the select list if the statement contains a UNION, INTERSECT or EXCEPT operator
如果我删除最后一个 ORDER BY 元素,它会起作用:
SELECT 2, LFEA_TYPE, LFEA_TITLE, LFEA_CHECKED, LFEA_VALUE, LFEA_PARAGRAPH FROM LFEA WHERE LFEA_LIS_ID = 230130 UNION SELECT 1, 'ACCOM', 'Air Conditioning', 'Y', LIS_AC_TEXT, NULL FROM LIS WHERE LIS_ID = 230130 ORDER BY 1 ASC, 2 ASC, 4 DESC, 5 DESC
所以可以肯定是 LFEA_PARAGRAPH 元素导致了问题。
根据我的经验(以及 MSDN 文档),我了解到您在 ORDER BY 中使用的列名应该是第一个查询中的列名。所以我很困惑为什么这不能按预期工作。
【问题讨论】:
-
order by中的列名仅在它们单独出现时才解析为来自SELECT的投影列。如果它们涉及ORDER BY中的任何类型的表达式,则不会以这种方式解决
标签: sql sql-server sql-order-by union