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。
我不知道该怎么做。
谢谢指教。
使用此模型,您必须保证规则将被正确应用,否则可能会出现许多问题:
- 一个child可以有2个以上parent
- 一个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 列)。
关于 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。
我不知道该怎么做。
谢谢指教。
使用此模型,您必须保证规则将被正确应用,否则可能会出现许多问题:
- 一个child可以有2个以上parent
- 一个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 列)。