有没有一个公式或技巧,只需将列缝合在一起,而不制作笛卡尔积来连接表?
例如,这样:

select
    *
from
    generate_series(1,3) a
??
    generate_series(10,11) b
??
    generate_series(21,24) c

会给出:
a       b       c
------  ------  ------
1       10      21
2       11      22
3       (null)  23
(null)  (null)  24

给了一个神秘的接线员。
实际上,我有一些子选择,我想用这种方式缝合在一起。它们的行数可能不同。上面的??只是获取一些样本数据的一种方法。

最佳答案

您可以添加选项with ordinalitygenerate_series()中的每一行生成行号。然后根据行号执行full outer join操作:

select a.a, b.b, c.c
from generate_series(1,3) with ordinality a (a,rn)
  full outer join generate_series(10,11) with ordinality b (b, rn) using (rn)
  full outer join generate_series(21,24) with ordinality c (c, rn) using (rn)

这将返回:
a | b  | c
--+----+---
1 | 10 | 21
2 | 11 | 22
3 |    | 23
  |    | 24

如果您的源不是agenerate_series(),则需要向每个子选择添加arow_number()
select ...
from (
   select ...,
          row_number() over (order by ...) as rn
   from table_one
) as a (..., rn)
  full outer join (
    select ...,
           row_number() over (order by ...) as rn
    from table_two
  ) as b (..., rn) using (rn)
....

关于sql - 通过缝合列连接表格,而无需制作笛卡尔积,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35987453/

10-11 03:37