【问题标题】:Sorting in sql union在 sql union 中排序
【发布时间】:2016-02-13 10:55:47
【问题描述】:

假设我的表 1 和表 2 具有相同的列。我想将它们组合并按column3和column4排序,并保留表列顺序。怎么可能?

我收到以下错误:

ORDER BY 项必须出现在选择列表中,如果语句 包含 UNION、INTERSECT 或 EXCEPT 运算符。

查询

SELECT COLUMN1, COLUMN2, COLUMN3, COLUMN4 FROM TABLE 1
UNION COLUMN1, COLUMN2, COLUMN3, COLUMN4 FROM TABLE 2
ORDER BY COLUMN2, COLUMN3

【问题讨论】:

  • UNION的第二个查询中缺少SELECT关键字
  • select * from (SELECT COLUMN1, COLUMN2, COLUMN3, COLUMN4 FROM TABLE 1 UNION SELECT COLUMN1, COLUMN2, COLUMN3, COLUMN4 FROM TABLE 2)x ORDER BY x.COLUMN2, x.COLUMN3

标签: sql sql-server select sql-order-by union


【解决方案1】:

unionunion all 运算符处理完整的查询。您在union 之后缺少select 关键字:

SELECT COLUMN1, COLUMN2, COLUMN3, COLUMN4 FROM TABLE1
UNION 
SELECT COLUMN1, COLUMN2, COLUMN3, COLUMN4 FROM TABLE2
ORDER BY COLUMN2, COLUMN3

【讨论】:

  • 我猜这只是一个错字,如果选择丢失,错误可能是:'column name' 附近的语法不正确
【解决方案2】:

使用子查询
示例:

SELECT * FROM 
(
SELECT COLUMN1, COLUMN2, COLUMN3, COLUMN4 FROM TABLE1
UNION 
SELECT COLUMN1, COLUMN2, COLUMN3, COLUMN4 FROM TABLE2
) ResultTABLE

ORDER BY ResultTABLE.COLUMN2, ResultTABLE.COLUMN3

此方法可以帮助您避免列不明确并对整个结果进行排序。

【讨论】:

    【解决方案3】:

    当您使用 UNION 或 UNION ALL 结果集时,默认情况下从第一个查询中获取列名。因此,当您编写 ORDER BY 时,请确保在查询结束时给出第一个查询中的名称(在您的情况下为 table1)。我猜在你的情况下 table1 和 table2 没有相同的列。所以需要在 ORDER BY 中写 query1(table1) 列名。

    SELECT COLUMN1, COLUMN2, COLUMN3, COLUMN4 FROM TABLE 1
    UNION 
    select COLUMN1, COLUMN2, COLUMN3, COLUMN4 FROM TABLE 2
    ORDER BY COLUMN2, COLUMN3 -- here column names should be from the table1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-06
      相关资源
      最近更新 更多