加入父子表的最佳方式

Posted

技术标签:

【中文标题】加入父子表的最佳方式【英文标题】:Best way to join parent and child tables 【发布时间】:2013-08-08 12:38:53 【问题描述】:

我有父表AA 的子表很少,例如 B,C,D,E,F,G 子表不相互链接。它们仅链接到AA 有一个键 Id,它在所有子表中用作外键。

加入这些表的最佳方法应该是什么,以便我可以在此创建一个视图?

【问题讨论】:

这取决于你想要什么输出。您想要不同表中的不同列具有相同的 A 值,还是想要公共列和单独的行? @Nenad..bascally 我需要一个逻辑视图,它应该包含所有表的所有记录,以便我可以使用单个视图从任何表中获取任何数据.. 想要这样做是不寻常的,因为如果八个子表中的每一个都有给定父表的四个记录,那么一次查询所有记录将向客户端返回 65,536 行。一般来说,将每个子记录连接到每个其他子表中的每个记录是没有意义的。 【参考方案1】:

由于父级可能在其中一些表中有子行,因此您必须使用 LEFT OUTER JOIN。

LEFT OUTER JOIN 连接两个表,返回 LEFT 表的所有行,在本例中为 A 和来自其他表的所有匹配项。当没有匹配时,它将在没有匹配的表的相应列中返回NULL。

SELECT *
FROM A
LEFT OUTER JOIN B
    ON A.Id = B.ParentID
LEFT OUTER JOIN C
    ON A.Id = C.ParentID
    LEFT OUTER JOIN P
        ON C.Id = P.ParentID
    LEFT OUTER JOIN Q
        ON C.Id = Q.ParentID
LEFT OUTER JOIN D
    ON A.Id = D.ParentID
LEFT OUTER JOIN E
    ON A.Id = E.ParentID
LEFT OUTER JOIN F
    ON A.Id = F.ParentID
    LEFT OUTER JOIN X
        ON F.Id = X.ParentID
    LEFT OUTER JOIN Y
        ON F.Id = Y.ParentID
LEFT OUTER JOIN G
    ON A.Id = G.ParentID

编辑

我添加了一种添加子子项的方法。我更倾向于使它们在视觉表示中明显。但请注意...如果这导致子子项有其他子项等,则可能您的结构不是最佳的。

【讨论】:

假设一些孩子有子孩子..例如C有孩子PQ..F有孩子XY..那么应该如果我在同一个查询中也为这些子子项使用 JOIN 是否有效? 你应该离开加入他们。但它可能导致无限链。例如,如果有自己的子孩子的子孩子...... 谢谢..知道了..是的,在某些情况下,我确实有多个级别的孩子..所以我相信这应该是我可以遵循的唯一方法,因为我需要一个视图。 .在优化方面我们可以采取什么更好的方法吗? 嗯,这在很大程度上取决于你想要什么。规范化规定每个实体都应该有自己的表,所以如果这些是不同的实体结构,你应该有不同的表。即使你有一种实体,比如链接到其他人的人,你也必须遵循上述结构。我唯一的评论是让您避免拥有长的关系链,因为您将无法真正创建存储的查询。你必须让它动态化,这意味着其他复杂性......【参考方案2】:
select <wanted columns>
from a
left join b
on a.id = b.a_id
left join c
on a.id = c.a_id
left join d
on a.id = d.a_id

【讨论】:

以上是关于加入父子表的最佳方式的主要内容,如果未能解决你的问题,请参考以下文章

与数据库进行父子进程通信的最佳设计

c# mdi父子窗口,传值问题

为啥 PL/SQL Bulk DML 对具有父子约束表的大型数据集运行缓慢?

MYSQL Join - 父子表连接,只获取子表的最新记录

如何搭建父子域环境?

vue父子组件传值方式