2017-04-26 93 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

相關問題