在SQL中选择包含所有子项的父记录

Cra*_*ker 8 sql t-sql sql-server sql-server-2005

假设我有两个表,"父"和"孩子".Parent-to-Child是一个很多:很多关系,通过标准的交叉引用表实现.

我想查找使用SQL的给定Child组的所有成员引用的Parent的所有记录(特别是MS SQL Server的T-SQL; 2005语法是可接受的).

例如,假设我有:

  • 项目清单
  • 亲爱丽丝
  • 父鲍勃
  • 查理小姐引用了爱丽丝,鲍勃
  • 儿子大卫引用爱丽丝
  • 儿童夏娃参考鲍勃

我的目标是:

  • 如果我有Child Charlie,我希望结果集包括Alice和Bob
  • 如果我有Child Charlie和David,我希望结果集包括Alice和NOT Bob.
  • 如果我有孩子查理,大卫和夏娃,我希望结果集包含任何人.

Cad*_*oux 6

依赖于数字技巧(父子链接的数量=子节点数,父节点链接到所有子节点):

SELECT Parent.ParentID, COUNT(*)
FROM Parent
INNER JOIN ChildParent
    ON ChildParent.ParentID = Parent.ParentID
INNER JOIN Child
    ON ChildParent.ChildID = Child.ChildID
WHERE <ChildFilterCriteria>
GROUP BY Parent.ParentID
HAVING COUNT(*) = (
    SELECT COUNT(Child.ChildID)
    FROM Child WHERE <ChildFilterCriteria>
)
Run Code Online (Sandbox Code Playgroud)