【问题标题】:Order By Column Name in Union Query联合查询中按列名排序
【发布时间】: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


【解决方案1】:

如果您将union 包装在子查询中,并在外部查询中排序,这会更好吗?

SELECT *
FROM (
    SELECT 2 as col1, LFEA_TYPE, LFEA_TITLE, LFEA_CHECKED, LFEA_VALUE, LFEA_PARAGRAPH FROM LFEA WHERE LFEA_LIS_ID = 230130 
    UNION ALL SELECT 1, 'ACCOM', 'Air Conditioning', 'Y', LIS_AC_TEXT, NULL FROM LIS WHERE LIS_ID = 230130 
) t
ORDER BY 1, 2, 4 DESC, 5 DESC, 
    CASE WHEN LFEA_PARAGRAPH IS NOT NULL AND LFEA_PARAGRAPH <> '' THEN 2 ELSE 1 END 

【讨论】:

  • 它会产生这个错误“没有为't'的第1列指定列名”
  • 按照您编写查询的方式工作是有道理的,但是,我不能使用 ORDER BY 中第一个 UNIONed 查询中的列名是否有意义?
  • @Nick:是的,您也需要为第一列设置别名。已在查询中修复。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-03
  • 1970-01-01
  • 1970-01-01
  • 2012-04-10
  • 2012-03-14
  • 2010-11-25
相关资源
最近更新 更多