Postgresql为子代替父母创建视图

时间:2016-03-12 22:46:10

标签: postgresql view many-to-many

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

children_tab: children_id |名字|名字

parent_tab: parent_id |名字|名字

children_to_parent children_id | PARENT_ID

每个孩子都有一两个父母。

我想创建子视图,其中还包含4个附加列:parent_id_1,parent_fullname_1,parent_id_2,parent_fullname_2。

我不知道该怎么做。

感谢您的建议。

1 个答案:

答案 0 :(得分:2)

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

  1. 一个孩子可以有两个以上的父母
  2. 一个孩子没有父母
  3. 但是假设这会受到您的应用程序的限制,您可以使用window function并输入 child_to_parent 表来处理此问题:

    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
    

    您的结果将如下所示:

    enter image description here

    请注意,我使用了LEFT JOIN,因为基于此数据库模型的孩子可能没有父级。因此,它的数据将返回父项数据为空。

    您应该考虑不使用此 children_to_parent 表并将这些ID放在children_tab中(例如:parent1_id,parent2_id),并根据这些列创建一个FK到parent_tab。

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