首页 > 解决方案 > 如何在 SQL Server 中使用 ORDER BY 和 UNION ALL?

问题描述

我有 3 个表,我需要使用UNION ALL.

假设表 (T1,T2,T3) 包含如下列:

表 T1

Name, Qty, Amt, EXP

表 T2

Qty, Amt, EXP, SRNO

表 T3

Name, Qty, EXP

我的查询是这样的:

SELECT Name, Qty, Amt, EXP 
FROM T1

UNION ALL

SELECT NULL AS Name, Qty, Amt, EXP 
FROM T2 
ORDER BY SRNO

UNION ALL

SELECT Name, Qty, NULL Amt, EXP 
FROM T3

我也试过

SELECT Name, Qty, Amt, EXP
FROM T1

UNION ALL

SELECT Name, Qty, Amt, Exp 
FROM 
    (SELECT * 
     FROM T2 
     ORDER BY SRNO) AS T21

UNION ALL

SELECT Name, Qty, NULL Amt, EXP
FROM T3

T2 的结果不均匀,我想按 SRNO(integer) 对其进行排序,但在使用联合时出现错误。

注意我不想接受SRNOUNION ALL我只需要它来对数据进行排序

标签: sql-server

解决方案


您可以尝试在当前联合查询中显式添加两个排序列:

SELECT Name, Qty, Amt, Exp
FROM
(
    SELECT Name, Qty, Amt, 'EXP' AS Exp, 1 AS p1, 1 AS p2 FROM T1  -- place this row 1st
    UNION ALL
    SELECT Name, Qty, Amt, Exp, 2, SRNO FROM T2                    -- middle
    UNION ALL
    SELECT Name, Qty, NULL, 'EXP', 3, 1 FROM T3                    -- place this row 3rd
) t
ORDER BY
    p1, p2;

在这里,我们向联合查询添加两个虚拟排序级别。p1排序级别将单个记录从第T1一个开始,将单个记录从T3最后一个开始,并将记录从T2中间开始。然后,第二个排序级别按升序p2对记录进行排序。如果不是整数列,那么我们将不得不对上述答案进行轻微更改,但它应该仍然有效。T2SRNOSRNO


推荐阅读