2017-04-26 90 views
0

假设非常简单的模式PostgreSQL的显示2子列表中一个结果

表主

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

表SUB1

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

表SUB2

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

作为输出I将像

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

使用UNION我可以得到接近,但随后每个列表获取的它自己的行

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 

那么,有没有办法让他们两个行和公正使用尽可能多的行作为最长的列表?

+2

g'应与记录在您的预期输出相关的值'介绍。你能详细说明你的输出背后的逻辑吗? –

+0

没有真正的逻辑,只有第三方的要求把它放在一个单一的CSV。 – Eelke

+1

我认为@TimBiegeleisen不是要求合理性,而是关于我们应该遵循的算法来获得样本 –

回答

2

一两件事,可以给你这种“交错”输出为unnest() function with multiple parameters (or its equivalent: the ROWS FROM(...) construct)

表函数也可以使用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

相关问题