📅  最后修改于: 2023-12-03 14:58:25.910000             🧑  作者: Mango
给定以下关系:
Father (parent, child)
Mother (parent, child)
GrandParent (ggparent, ggchild)
Brother (sibling1, sibling2)
Sister (sibling1, sibling2)
Uncle (uncle, nephew)
写一个SQL查询语句,找出所有与Jone有至少两条关系的人。
题目要求我们通过给定的关系表找出所有与 "Jone" 相关的人,并且他们之间至少有两条关系(比如可以是祖父母-父母-兄弟姐妹之间的关系,或者叔侄之间的关系)。
因此,我们需要使用联结查询,同时利用子查询来统计每个人与 "Jone" 之间的关系数。
具体步骤如下:
JOIN
语句将 "Father" 表和 "Mother" 表联结起来,得到 "Parent" 表。UNION
语句将 "Parent" 表和 "GrandParent" 表合并成一个表。UNION
语句将 "Brother" 表和 "Sister" 表合并成一个表。最终的 SQL 语句如下所示(假设 "Jone" 的 ID 为 1):
SELECT DISTINCT p1.child
FROM (
SELECT parent AS person FROM Father WHERE child = 1
UNION
SELECT parent AS person FROM Mother WHERE child = 1
UNION
SELECT ggparent AS person FROM GrandParent WHERE ggchild = 1
) p1
JOIN (
SELECT parent AS person FROM Father WHERE child = 1
UNION
SELECT parent AS person FROM Mother WHERE child = 1
UNION
SELECT ggparent AS person FROM GrandParent WHERE ggchild = 1
) p2 ON p1.person = p2.person AND p1.person <> 1
WHERE (
SELECT COUNT(*)
FROM (
SELECT parent AS person FROM Father WHERE child = 1
UNION
SELECT parent AS person FROM Mother WHERE child = 1
UNION
SELECT ggparent AS person FROM GrandParent WHERE ggchild = 1
UNION
SELECT sibling1 AS person FROM Brother
UNION
SELECT sibling2 AS person FROM Brother
UNION
SELECT sibling1 AS person FROM Sister
UNION
SELECT sibling2 AS person FROM Sister
UNION
SELECT uncle AS person FROM Uncle_Brother_Sister
UNION
SELECT nephew AS person FROM Uncle_Brother_Sister
) r
WHERE r.person = p1.child
) >= 2;