通过拼接列来连接表格,而无需制作笛卡尔积

时间:2016-03-14 12:22:04

标签: sql postgresql

是否有一个公式或技巧可以通过将列拼接在一起而不制作笛卡尔积来连接表格?

例如,以便:

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

给出了一个神秘的??运算符。

我实际上有几个子选择,我想以这种方式拼接在一起。它们的行数可能不同。上面的generate_series()只是一种获取样本数据的方法。

1 个答案:

答案 0 :(得分:4)

您可以添加选项with ordinality,为generate_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

如果您的来源不是generate_series(),那么您需要为每个子选择添加row_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)
....