使用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

这是不能在现实FASION回答 - 忽略了片刻的SQL语句组成部分,但你甚至不知道你想要什么。 “也许” - 好了,再想想通过。如果您有什么多个部分的祖先?你会怎么做呢?

查找给定的后代的所有祖先是微不足道的(临时表,填充与它的父母的递归,加入“代远”作为字段)。

然后你就可以加入这两个临时表。尼斯到目前为止(和遗憾,基本上必须是,因为你的hierarchiy可以去很多代以前)。

不过,从那里你还是要真正找到什么的解释是:一个合理的算法 - 在不平凡的场景;)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top