Postgresql 为 child 显示 parents 创建视图

Postgresql create view for child displaing parents

关于 Postgres,我有三个 table:children、parent、children_to_parent。 这是多对多的关系。

children_tab: children_id |姓名 |姓

parent_tab: parent_id |姓名 |姓

children_to_parent children_id | parent_id

每个 children 都有一两个 parent。

我想创建 children 视图,该视图还将包含 4 个附加列:parent_id_1、parent_fullname_1、parent_id_2、parent_fullname_2。

我不知道该怎么做。

谢谢指教。

使用此模型,您必须保证规则将被正确应用,否则可能会出现许多问题:

  1. 一个child可以有2个以上parent
  2. 一个child可以没有parent个

但假设这将受到您的应用程序的限制,您可以使用 window function 并有时输入 child_to_parent table处理这个:

select  ch.children_id, 
    ch.name, 
    ch.lastname, 
    pt1.parent_id parent_id_1, 
    pt1.name parent_name_1, 
    pt1.lastname parent_lastname_1, 
    pt2.parent_id parent_id_2, 
    pt2.name parent_name_2, 
    pt2.lastname parent_lastname_2
from    children_tab ch
    -- JOIN for parent 1
    left join (
        select  ch.children_id, ch.parent_id
            ,row_number() OVER (PARTITION BY ch.children_id ORDER BY ch.parent_id asc) rown
        from    children_to_parent ch
    ) window_prt1 on ch.children_id=window_prt1.children_id and window_prt1.rown=1
    left join parent_tab pt1 on window_prt1.parent_id=pt1.parent_id
    -- JOIN for parent 2
    left join (
        select  ch.children_id, ch.parent_id
            ,row_number() OVER (PARTITION BY ch.children_id ORDER BY ch.parent_id asc) rown
        from    children_to_parent ch
    ) window_prt2 on ch.children_id=window_prt2.children_id and window_prt2.rown=2
    left join parent_tab pt2 on window_prt2.parent_id=pt2.parent_id

您的结果将如下所示:

注意我用LEFT JOIN是因为你的children,基于这个数据库模型,可以没有parent。所以它的数据将 return 与 parents 数据为空。

您应该考虑不使用此 children_to_parent table 并将这些 ID 放入 children_tab(例如:parent1_id, parent2_id) 并根据这些列创建到 parent_tab 的外键。

使用此模型,您可以强制他们 not null 并知道谁是父亲,谁是母亲(例如:father_id 和 mather_id)将它们链接到 parent_tab table(到 parent_id 列)。