有没有一个公式或技巧,只需将列缝合在一起,而不制作笛卡尔积来连接表?
例如,这样:
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 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
如果您的源不是a
generate_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/