连接两个表并在一行中合并多个关联

时间:2017-10-06 13:35:49

标签: sql database postgresql view

加入两个PSQL表时,我现在卡住了。我知道这些问题一直都在问我,但我找不到适合我情况的答案。我为模糊的问题标题道歉。

描述简化情况:我们有两个表,childrenparents。正如你所看到的那样,孩子们用他们的id以逗号分隔的“数组”链接到他们的父母。我想从孩子的角度创建一个简单的视图(非物化的),父母与孩子一起加入。

表儿童

| 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         |

我想要的结果的最佳解决方案是什么?

1 个答案:

答案 0 :(得分: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个父母。如果您过度简化您的问题或在您的数据中拥有现代家庭,请务必小心。