質問

SQL Server 2008を使用します。 私はテーブルに格納されている動物の家族の木があり、子孫がどのように「遺伝的に多様な」(またはしない)上のいくつかの情報を提供したいです。 SQLでどのように私は両親がどのように密接に関連を示すために賢明な指標を作ることができますか? 共有祖先?

がある前に戻るにはおそらく、共有血液の割合のいくつかの並べ替え、または世代数
AnimalTable 
Id
Name
mumId
dadId

select * from AnimalTable child
inner join AnimalTable mum on child.[mumId] = mum.[Id]
inner join AnimalTable dad on child.[dadId] = dad.[Id]

inner join AnimalTable mums_mum on mum.[mumId] = mums_mum.[Id]
inner join AnimalTable mums_dad on mum.[dadId] = mums_dad.[Id]

inner join AnimalTable dads_mum on dad.[mumId] = dads_mum.[Id]
inner join AnimalTable dads_dad on dad.[dadId] = dads_dad.[Id]
役に立ちましたか?

解決

私はあなたがCTE(共通テーブル式)を使用して、再帰を見てお勧めします。

共通の祖先は、この値を維持しながら、発見されるまで、これは親を再帰的に見にあなたをできるようになります。

他のヒント

WITH    hier1(parent, level) AS
        (
        SELECT  mum, 1
        FROM    AnimalTable a
        WHERE   a.id = @first_animal
        UNION ALL
        SELECT  dad, 1
        FROM    AnimalTable a
        WHERE   a.id = @first_animal
        UNION ALL
        SELECT  mum, level + 1
        FROM    q
        JOIN    AnimalTable a
        ON      a.id = q.parent
        UNION ALL
        SELECT  dad, level + 1
        FROM    q
        JOIN    AnimalTable a
        ON      a.id = q.parent
        ),
        hier2(parent, level) AS
        (
        SELECT  mum, level
        FROM    AnimalTable a
        WHERE   a.id = @second_animal
        UNION ALL
        SELECT  dad, level
        FROM    AnimalTable a
        WHERE   a.id = @second_animal
        UNION ALL
        SELECT  mum, level + 1
        FROM    q
        JOIN    AnimalTable a
        ON      a.id = q.parent
        UNION ALL
        SELECT  dad, level + 1
        FROM    q
        JOIN    AnimalTable a
        ON      a.id = q.parent
        )
SELECT  TOP 1
        h1.parent,
        CASE WHEN h1.level < h2.level THEN h1.level ELSE h2.level END AS minlevel
FROM    hier1 h1
JOIN    hier2 h2
ON      h1.parent = h2.parent
ORDER BY
        2

これは現実的な流行っにはお答えできません - 一瞬SQL部分を無視し、しかし、あなたも、あなたが望むものを知りません。 「おそらく」 - まあ、それを再び経由だと思います。あなたが複数の部分の祖先を持っている場合は?あなたは、何をしますか?

与えられた子孫のすべての祖先を見つけることは簡単です。

は(一時テーブル、それに塗りつぶしが「離れ世代」をフィールドとして追加し、再帰的に両親のためです)。

次に、2つの一時テーブルを結合することができます。ニースこれまでに(と申し訳ありませんが、あなたのhierarchiyが戻って多くの世代に行くことができるので、それは基本的に、である必要があります)。

;非自明なシナリオで -

しかし、そこSTILL実際に意味することになっているというものに賢明なアルゴリズムを見つけなければならないから、

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top