0

假设非常简单的模式

主表

main_id, ...
1      , ...
2      , ...

表子1

main_id, sub1_data
1      , a
1      , b
2      , g

表子2

main_id, sub2_data
1      , 1
2      , 1
2      , 2

作为输出我想要

main_id, sub1_data, sub2_data
1      , a        , 1
1      , b        , <null>
2      , g        , 1
2      , <null>   , 2

使用联合我可以接近但每个列表都有它自己的行

SELECT main_id, sub1_data, NULL
FROM sub1
UNION 
SELECT main_id, NULL, sub2_data
FROM sub2

结果

main_id, sub1_data, sub2_data
1      , a        , <null>
1      , b        , <null>
1      , <null>   , 1
2      , g        , <null>
2      , <null>   , 1
2      , <null>   , 2

那么有没有办法让它们共享两个行并使用与最长列表一样多的行?

4

1 回答 1

2

可以为您提供这种“交错”输出的一件事是unnest()具有多个参数的函数(或其等效项:ROWS FROM(...)构造)

表函数也可以使用ROWS FROM语法组合,结果在并行列中返回;在这种情况下,结果行数是最大函数结果的行数,较小的结果用空值填充以匹配。
...可以使用任意数量的数组参数调用
特殊表函数UNNEST,并返回相应数量的列,就好像UNNEST 已在每个参数上单独调用并使用ROWS FROM构造组合一样。

select     main_id, sub1_data, sub2_data
from       (select main_id, array_agg(sub1_data) sub1_arr from sub1 group by main_id) s1
full join  (select main_id, array_agg(sub2_data) sub2_arr from sub2 group by main_id) s2 using (main_id)
cross join unnest(sub1_arr, sub2_arr) u(sub1_data, sub2_data)

http://rextester.com/QSWESJ84203

注意:这是一个“相对”的新特性:它是在 9.4 中引入的

于 2017-04-26T09:52:33.260 回答