我想创建一个反向的家谱(血统),它从孩子开始,并显示整个线,直到第一对夫妇。我的数据库有上千个条目,并且有一个模式和附带的示例,如下所示:
0 id | 17444
5 Sire | 100
6 did | 203
7 Dam | 102
11 Name | Bruce其中孩子由名字和did表示。条目Dam和Sire也是dids。
我尝试了下面这样的方法:
def pedigree(did):
con = sqlite3.connect('subjects.db')
cursor = con.execute('SELECT * FROM animals where did IS "%s" ' % did)
for row in cursor:
print(row[11])
pedigree(row[5])
pedigree(row[7])它打印出一整面墙的文本,例如:
Bruce
Thomas
Martha
Partick
Sara
Kenneth
Catherine我在想我应该使用某种ADT,但我从大学开始就没有用过它。任何有用的建议都是很棒的!这不是学校的作业,这是我妻子想要的,哈哈。
这个问题与我的问题几乎相同,而且他们的回答也差不多:Pedigree/Family tree chart from database
发布于 2020-05-17 09:44:45
一种选择是使用递归公用表表达式遍历分层结构:
with recursive cte as (
select name, sire, dam, 0 lvl from animals where did = ?
union all
select a.name, a.sire, a.dam, c.lvl + 1
from cte c
inner join animals a on a.did in (c.sire, c.dam)
)
select * from cte order by lvl递归查询的锚点通过did选择初始行;然后,递归部分向上跟踪关系,选择与前一次迭代的sire和dam相对应的记录,直到树耗尽。作为奖励,我添加了一个名为lvl的列,它表示树中每个节点的深度。
基本上,这模仿了你在应用程序代码中实现的算法-然而,这应该更有效,因为所有的工作都是在数据库中一次执行的,而不是在python中迭代并运行多个查询。
https://stackoverflow.com/questions/61845831
复制相似问题