我可以使用哪种方式来合并两个排序的结果。
示例:
SELECT * FROM (VALUES (1),(2),(3),(4)) AS X(a);
┌───┐
│ a │
├───┤
│ 1 │
│ 2 │
│ 3 │
│ 4 │
└───┘
(4 rows)
还有
SELECT * FROM (VALUES ('A'),('B'),('C'),('D')) AS X(a);
┌───┐
│ a │
├───┤
│ A │
│ B │
│ C │
│ D │
└───┘
(4 rows)
结果
┌───┐
│ a │
├───┤
│ A │
│ 1 │
│ B │
│ 2 │
│ C │
│ 3 │
│ D │
│ 4 │
└───┘
(4 rows)
我尝试一些解决方案,为每个结果创建一个带有模数的新临时列,但是我阻止合并,我不确定它是否确实在执行。
感谢您的建议。
答案 0 :(得分:1)
select a from (
SELECT a::text, row_number() OVER() as rowcount, 2 as sort_table
FROM (VALUES (1),(2),(3),(4)) AS X(a)
UNION ALL
SELECT a::text, row_number() OVER(), 1
FROM (VALUES ('A'),('B'),('C'),('D')) AS X(a)
) s
ORDER BY
rowcount, sort_table
您必须添加一些元数据以找到正确的排序顺序。首先,我向两个表添加了row_number()
窗口函数(https://www.postgresql.org/docs/current/static/tutorial-window.html)。这将为每行添加一个唯一的行号。因此,它可用作一阶列。现在,我可以按行号进行排序:首先是所有表的第一行,然后是表的第二行,...现在,您的结果中有两个“第一”行必须进行排序。如果要第二个表的行,可以通过一个恒定值来实现。我将其命名为sort_table
。
答案 1 :(得分:1)
好吧,可以使用ROW_NUMBER完成操作,但是为什么需要这么做?
select a
from
(
SELECT a, 2 as flag, row_number() over (order by a) as rn
FROM (VALUES (1),(2),(3),(4)) AS X(a)
union all
SELECT a, 1 as flag, row_number() over (order by a) as rn
FROM (VALUES ('A'),('B'),('C'),('D')) AS X(a)
) as dt
order by rn, flag
当然,两个Select都需要匹配的数据类型。
答案 2 :(得分:-1)
,其中cte(a,RowsNumber)为( SELECT CONVERT(varchar(120),a)[a],ROW_NUMBER()over(由a排序)[RowsNumber] FROM(VALUES(1),(2),(3),(4))AS X(a)全部合并 选择ROW_NUMBER()超过(按a排序)[行数]从(值('A'),('B'),('C'),('D'))AS X(a))选择一个从CTE顺序按RowsNumber