合并两个排序的结果,并间歇性地一对一地合并

时间:2018-09-26 09:07:18

标签: sql postgresql postgresql-10

我可以使用哪种方式来合并两个排序的结果。

示例:

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)

我尝试一些解决方案,为每个结果创建一个带有模数的新临时列,但是我阻止合并,我不确定它是否确实在执行。

感谢您的建议。

3 个答案:

答案 0 :(得分:1)

demo: db<>fiddle

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