回答

收藏

在SQL中选择所有子级的父记录

技术问答 技术问答 358 人阅读 | 0 人回复 | 2023-09-14

假设我有两张表,父母和孩子。父子关系是一种多对多的关系,可以通过标准的交叉引用表来实现。
. f# l6 U; V; ~$ l我想找到使用SQL(特别是MS SQL Server的T-SQL; 2005语法可引用的所有 2005语法都可以接受)Parent记录。/ x$ `8 c6 B4 P3 A3 M* J
例如,假设我有:
5 z. x0 i) R  h3 uList item
/ K) B! o& {! VParent Alice* m/ b5 e9 ?4 n! m3 C' W
Parent Bob. D) X$ N; p6 I" n4 ?; q( a* s$ Q
Child Charlie references Alice,Bob
( R# z5 q9 e1 [- T& dChild David references Alice3 ~6 o- _8 U0 c
Child Eve references Bob
我的目标是:
# v6 T/ u4 b8 ~" m) Z$ V3 P假如我有儿童查理(Charlie Charlie),我希望结果集包括爱丽丝(Alice)和鲍勃(Bob): x, u+ L3 d# O# \6 y, T
如果我有孩子查理和大卫,我希望结果集包括爱丽丝和 不是    鲍勃。( u: c! n" b, v' v! Z* C9 x" z
假如我有孩子查理(Charlie),大卫(David)和夏娃(Eve),希望结果集不包括任何人。
                                                               
; {. W- V. g8 Y+ Y& d% ]) N! U    解决方案:                                                                  t1 V% C9 r* [" p6 e+ ^4 ?
                                                                依靠数字技能(包括父子链接的数量)=子代的数量,该父代链接到所有子代):2 m+ ~. k, T; R3 Q; @$ ~3 H# l
SELECT Parent.ParentID,COUNT(*)FROM ParentINNER JOIN ChildParent    ON ChildParent.ParentID = Parent.ParentIDINNER JOIN Child    ON ChildParent.ChildID = Child.ChildIDWHERE GROUP BY Parent.ParentIDHAVING COUNT(*) =  SELECT COUNT(Child.ChildID)    FROM Child WHERE )
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则