2

次の問題を解決する必要があります: 2 人の人物が共通の祖先を持っているかどうかを確認する SQL 関数を作成しますが、行き詰まっています。私は作成します

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

および Persons テーブル

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 を返す 3 つのパラメーター (2 人と検索レベル) を持つ関数です)。私の下手な英語でごめんなさい。

4

2 に答える 2

3

再帰的な CTE がその方法です。一番わかりやすいと思います。より速い方法があるかもしれませんが、これがどのように機能するかは明らかです。私はオラクル サーバーにアクセスできないので、タイプミスがあるかもしれません。以下に 2 つの手順を示します。これにより、その動作をテストして理解することができます。

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) 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

うわー、それはトリッキーです。いずれかの人物のすべての祖先を取得するには、再帰クエリが必要です。ただし、親が 2 人いるため、母と父のペアが得られますが、これを単一の祖先に分割する必要があります。次に、セットに共通の祖先が少なくとも 1 つあるかどうかを調べます。このステートメントは、共通の祖先が少なくとも 1 つある場合は 1 を返し、それ以外の場合は 0 を返します。

    祖先_of_person_1を
    (
      母親のID、父親のIDを選択
      client_iulia から
      person_id = 1 で開始
      person_id = 前の母 ID または person_id = 前の父 ID で接続
    )
    、ancers_of_person_2 として
    (
      母親のID、父親のIDを選択
      client_iulia から
      person_id = 2 から開始
      person_id = 前の母 ID または person_id = 前の父 ID で接続
    )
    選択数(*)
    から
    (
      (
      祖先として母のIDを選択してから、祖先_の_人_1
      連合
      先祖として父のIDを選択します先祖_の_人_1から
      )
      交わる
      (
      祖先として母のIDを選択します先祖_の_人_2から
      連合
      祖先_of_person_2から祖先としてfather_idを選択します
      )
    )
    行番号 = 1;

編集: これは sqlfiddle です。人物 1 と 3 には共通の先祖 122 がいますが、人物 1 と 2 には共通点がありません。試してみてください: sqlfiddle

于 2013-10-21T09:29:54.043 に答える