加入父子表的最佳方式
Posted
技术标签:
【中文标题】加入父子表的最佳方式【英文标题】:Best way to join parent and child tables 【发布时间】:2013-08-08 12:38:53 【问题描述】:我有父表A
。
A
的子表很少,例如 B
,C
,D
,E
,F
,G
子表不相互链接。它们仅链接到A
。
A
有一个键 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
有孩子P
和Q
..F
有孩子X
和Y
..那么应该如果我在同一个查询中也为这些子子项使用 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
【讨论】:
以上是关于加入父子表的最佳方式的主要内容,如果未能解决你的问题,请参考以下文章