質問
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実際に意味することになっているというものに賢明なアルゴリズムを見つけなければならないから、
所属していません StackOverflow