📜  门| GATE-CS-2004 |第 51 题(1)

📅  最后修改于: 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" 之间的关系数。

具体步骤如下:

  1. 使用 JOIN 语句将 "Father" 表和 "Mother" 表联结起来,得到 "Parent" 表。
  2. 使用 UNION 语句将 "Parent" 表和 "GrandParent" 表合并成一个表。
  3. 使用 UNION 语句将 "Brother" 表和 "Sister" 表合并成一个表。
  4. 将 "Uncle" 表与 "Brother/Sister" 表联结起来,得到 "Uncle_Brother_Sister" 表。
  5. 使用子查询来统计每个人与 "Jone" 之间的关系数,并将其与 2 进行比较。如果大于等于 2,则符合条件。

最终的 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;
参考链接