我有这个SQLite表:
CREATE TABLE seed (
code TEXT PRIMARY KEY,
name TEXT,
grams_per_seed REAL,
mother TEXT REFERENCES seed (code) DEFERRABLE INITIALLY DEFERRED,
notes TEXT,
mother_notes TEXT
) STRICT;
包含的数据包括:
sqlite> select code, mother from seed
...> where code in ("RP20-3", "RP19-1", "BC18-MG", "BC18-TI");
code mother
------- -------
BC18-MG
BC18-TI
RP19-1 BC18-TI
RP20-3 RP19-1
注意RP20-3
→ RP19-1
→ BC18-TI
的祖先链,在真实的数据中有很多这样的例子。
我需要的是一个将种子代码Map到其祖先链长度的查询。例如:
sqlite> select [... something ...] from [... something else ...];
code a_ct
------- ----
BC18-MG 0
BC18-TI 0
RP19-1 1
RP20-3 2
我已经用这个杂牌完成了一部分,但是我知道这是不正确的,因为最大链长编码在连接宽度中:
sqlite> select child.code, parent.code, grand.code
...> from seed as child, seed as parent, seed as grand
...> where child.code = "RP20-3"
...> and child.mother = parent.code
...> and parent.mother = grand.code;
code code code
------ ------ -------
RP20-3 RP19-1 BC18-TI
我非常确定这需要递归查询,但我一直无法使它工作。我尝试了几个查询,这些查询被设计为针对链中每个我可以计数的成员返回一行,但我要么没有得到行,要么得到无限多的行。
This question与我想要的非常相似,但它只为单个项目返回祖先,而不是所有项目。
我已经找到了很多递归查询的例子,包括父子关系的例子。看起来这应该是相对简单的,但是我在某个地方卡住了。我确实很好地处理了过程语言中的递归。我错过了什么?
1条答案
按热度按时间polkgigr1#
It may be useful, examples with recursive queries
You may add as many as needed columns "linkN". In all cases column count is fixed.
In next example, accumulate chain in text. Limitation is recursion depth, or max TEXT size, not fixed.