如何在sql中使用union all命令?

Wel*_*lla 57 sql sql-server

我尝试了下面给出的sql查询:

SELECT * FROM (SELECT * 
FROM TABLE_A ORDER BY COLUMN_1)DUMMY_TABLE
UNION ALL 
SELECT * FROM TABLE_B 
Run Code Online (Sandbox Code Playgroud)

它会导致以下错误:

除非还指定了TOP或FOR XML,否则ORDER BY子句在视图,内联函数,派生表,子查询和公用表表达式中无效.

我需要在联合中使用订单.我该如何做到这一点?

Joh*_*Woo 98

SELECT  * 
FROM 
        (
            SELECT * FROM TABLE_A 
            UNION ALL 
            SELECT * FROM TABLE_B
        ) dum
-- ORDER BY .....
Run Code Online (Sandbox Code Playgroud)

但如果您想从Table_A结果列表的顶部获取所有记录,您可以添加可用于订购的用户定义值,

SELECT  * 
FROM 
        (
            SELECT *, 1 sortby FROM TABLE_A 
            UNION ALL 
            SELECT *, 2 sortby FROM TABLE_B
        ) dum
ORDER   BY sortby 
Run Code Online (Sandbox Code Playgroud)


Gio*_*uri 34

你真的不需要括号.你可以直接排序:

SELECT *, 1 AS RN FROM TABLE_A
UNION ALL 
SELECT *, 2 AS RN FROM TABLE_B
ORDER BY RN, COLUMN_1
Run Code Online (Sandbox Code Playgroud)


Fan*_*o68 16

不是OP直接反应,但我想我会在这里响应OP的ERROR消息,这可能完全指向你的另一个方向!

一旦检索到记录集并且您对该批次进行排序,所有这些答案都指的是整体 ORDER BY.

如果你想独立地对UNION的每个部分进行ORDER BY ,并且仍然将它们"加入"同一个SELECT中,该怎么办?

SELECT pass1.* FROM 
 (SELECT TOP 1000 tblA.ID, tblA.CustomerName 
  FROM TABLE_A AS tblA ORDER BY 2) AS pass1
UNION ALL 
SELECT pass2.* FROM 
  (SELECT TOP 1000 tblB.ID, tblB.CustomerName 
   FROM TABLE_B AS tblB ORDER BY 2) AS pass2
Run Code Online (Sandbox Code Playgroud)

注意TOP 1000是一个任意数字.使用足够大的数字来捕获所需的所有数据.

  • 完美的。Oracle 允许您在任何地方进行排序...对于 SQL Server 来说是新的...使用 TOP 很棒,但是我发现它的功能在更复杂的查询中非常缺乏...我不断收到 OP 提到的 ORDER BY 错误...只是让我订购了该死的结果哈哈。 (2认同)
  • 您可以使用“TOP 100 PERCENT”子句。使用任意数字并相信它总是大于返回的记录数是不好的做法。 (2认同)