2

我必须解决以下问题:创建一个 sql 函数来检查两个人是否有共同的祖先,但我被卡住了。我创造

create type person as object
(
first_name varchar2(10),
last_namevarchar2(10)
);

和人员表

create table client_iulia
(Person_Id varchar2(13)constraint pk_id_client primary key,
Mother_Id varchar2(13),
Father_Id varchar2(13),
Name person);

我想做的是一个具有三个参数(两个人和搜索级别)的函数,如果有共同的祖先,则返回 1,否则返回 0)如果有人有任何想法,请帮助我。对不起我糟糕的英语。

4

2 回答 2

3

递归 CTE 是要走的路。我认为这是最容易理解的。可能有更快的方法,但这应该清楚它是如何工作的。我无法访问 oracle 服务器,所以我可能有拼写错误,我在下面显示了两个步骤,以便您可以测试并了解它是如何工作的。

1) 查找单个输入的所有祖先

with ancestors as
(
   SELECT *
   FROM client_iulia 
   WHERE Person_Id = @inputPerson
     UNION ALL
   SELECT *
   FROM client_iulia
   JOIN ancestors a on Person_ID = a.Mother_ID OR Person_ID = a.Father_ID
)
SELECT * 
FROM ancestors

2)找到两个目标的所有祖先

with ancestorsA as
(
   SELECT *
   FROM client_iulia 
   WHERE Person_Id = @inputPersonA
     UNION ALL
   SELECT *
   FROM client_iulia
   JOIN ancestorsA a on Person_ID = a.Mother_ID OR Person_ID = a.Father_ID
), ancestorsB as
(
   SELECT *
   FROM client_iulia 
   WHERE Person_Id = @inputPersonB
     UNION ALL
   SELECT *
   FROM client_iulia
   JOIN ancestorsB a on Person_ID = a.Mother_ID OR Person_ID = a.Father_ID
)
SELECT A.* 
FROM ancestorsA A
JOIN ancestorsB B ON A.Person_Id = B.Person_Id
于 2013-10-20T17:58:48.650 回答
0

哇,这很棘手。您需要递归查询来获取任一人的所有祖先。由于有两个父母,您将获得一对父母,但是您需要将其拆分为单一祖先。然后看看这些集合是否至少有一个共同的祖先。当至少有一个共同祖先时,此语句为您提供 1,否则为 0:

    与祖先_of_person_1 作为
    (
      选择mother_id,father_id
      来自client_iulia
      从 person_id = 1 开始
      通过 person_id = 先前的母亲 ID 或 person_id = 先前的父亲 ID 连接
    )
    ,祖先_of_person_2 为
    (
      选择mother_id,father_id
      来自client_iulia
      从 person_id = 2 开始
      通过 person_id = 先前的母亲 ID 或 person_id = 先前的父亲 ID 连接
    )
    选择计数(*)
    从
    (
      (
      从ancestors_of_person_1 中选择mother_id 作为祖先
      联盟
      从ancestors_of_person_1 中选择father_id 作为祖先
      )
      相交
      (
      从ancestors_of_person_2 中选择mother_id 作为祖先
      联盟
      从ancestors_of_person_2 中选择father_id 作为祖先
      )
    )
    其中rownum = 1;

编辑:这是一个 sqlfiddle。第 1 个人和第 3 个人有共同的祖先 122,而第 1 个人和第 2 个人没有共同祖先。试试看:sqlfiddle

于 2013-10-21T09:29:54.043 回答