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

Merge two sorted results with intermittently of one on two

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

示例:

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)

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

感谢您的建议。

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() window 函数 (https://www.postgresql.org/docs/current/static/tutorial-window.html) 添加到两个 table 中。这会为每行添加一个唯一的行号。所以这作为一阶列。现在我可以按行号排序:首先是所有 table 的第一行,然后是 table 的第二行,......现在你有两个 "first" 行在你的结果中必须订购。如果你想要第二个 table 的行,你可以通过一个常量值来实现。我把它命名为sort_table.

好吧,可以使用 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 中匹配数据类型。

用 cte(a, RowsNumber) 作为 ( SELECT CONVERT(varchar(120), a) [a], ROW_NUMBER() over(order by a) [RowsNumber] FROM (VALUES (1),(2),(3),( 4)) AS X(a) 联合所有 SELECT a, ROW_NUMBER() over(order by a) [RowsNumber] FROM (VALUES ('A'),('B'),('C'), ('D')) AS X(a)) Select a from cte order by RowsNumber