2017-10-06 173 views
0

我目前在加入兩個PSQL表時被卡住了。我知道這些問題總是被問到,但我卻無法找到適合我情況的答案。我爲模糊的問題標題道歉。加入兩個表並將多個關聯合併成一行

描述簡化情況:我們有兩個表格,childrenparents。正如你所看到的,孩子們用逗號分隔的「陣列」與他們的父母連接起來。我想創建一個簡單的視圖(非物化),從孩子的角度來看,父母與孩子一起參加。

表兒童

| id | name | parents | 
| -- | ----- | ------- | 
| 1 | Bob | 1,2  | 
| 2 | Alice | 3  | 

表父母

| id | name | phone | 
| -- | ----- | ----- | 
| 1 | Carol | 1234 | 
| 2 | Frank | 5678 | 
| 3 | Grace | 9012 | 

所需組合視圖

| child_id | child_name | parent1_name | parent1_phone | parent2_name | parent2_phone | 
| -------- | ---------- | ------------ | ------------- | ------------ | ------------- | 
| 1  | Bob  | Carol  | 1234   | Frank  | 5678   | 
| 2  | Alice  | Grace  | 9012   |    |    | 

我試圖達到上述具有以下視圖定義:

SELECT children.id AS child_id, 
    children.name AS child_name, 
    parents.name AS parent_name, 
    parents.phone AS parent_phone 
    FROM children 
    JOIN parents ON parents.id::text = 
     ANY (string_to_array(children.parents, ','::text)); 

當然,這並不孩子的父母雙方合併成一排:

| child_id | child_name | parent_name | parent_phone | 
| 1  | Bob  | Carol  | 1234   | 
| 1  | Bob  | Frank  | 5678   | 
| 2  | Alice  | Grace  | 9012   | 

什麼是我想要的結果的最佳解決方案?

回答

2

您需要根據您當前的查詢後,創造出一些聚集

SQL DEMO

WITH cte as (
    SELECT *, row_number() over (partition by child_id order by "parent_name") as rn 
    FROM queryResult 
) 
SELECT child_id, 
     child_name, 
     MAX(CASE WHEN rn = 1 then parent_name END) as parent_name_1, 
     MAX(CASE WHEN rn = 1 then parent_phone END) as parent_phone_1, 
     MAX(CASE WHEN rn = 2 then parent_name END) as parent_name_2, 
     MAX(CASE WHEN rn = 2 then parent_phone END) as parent_phone_2 
FROM cte 
GROUP BY child_id, child_name 
ORDER BY child_id 

輸出

enter image description here

注:這個假設最多隻有一個孩子只有2個父母。所以,如果你過分簡化了你的問題或者在你的數據中擁有現代家庭,那麼要小心。

+0

謝謝你的答案。不幸的是,我的數據庫由許多現代家庭組成;)我簡化了我的問題。實際上,我的'孩子'可以有多達5個父母(但也是零)。來自「父母」表的行最多包含5個要在視圖中合併的列。這會使你爲我提供的查詢非常麻煩。在處理更大的家庭和更多父數據列時,是否有辦法縮短或簡化查詢? –

+0

是的,我想這可能是一個問題。但如果是'高達5'我仍然認爲可以工作。但你也有交叉表函數(你需要添加一個擴展)檢查這個[**教程**](http://www.vertabelo.com/blog/technical-articles/creating-pivot-tables-in-postgresql-使用最交叉函數)。 –