关于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。
我不知道该怎么做。
感谢您的建议。
答案 0 :(得分:2)
使用此模型,您必须保证正确应用规则,否则可能会出现许多问题:
但是假设这会受到您的应用程序的限制,您可以使用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
您的结果将如下所示:
请注意,我使用了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列)。