1

我有下表:(我正在使用 sqlite)

.schema T 
CREATE TABLE T (i TEXT, j TEXT, v INTEGER);

select * from T;

i |j |v
x |y |1
x |z |1
y |a |1
z |b |1
a |c |1
c |d |1

我需要找到i给定深度的特定闭包。但是,对于 SQLite,我不能使用递归查询。我尝试编写一个查询,但无法有效地调用它以获得所需的结果:

sqlite> Select i,j,v  FROM T WHERE i='x'

...> union

...> SELECT R.i "i",T.j "j",R.v+t.v "v" FROM T JOIN T as R ON R.j=T.i where R.i='x';

i|j|v
x|a|2
x|b|2
x|y|1
x|z|1

这列出了深度为 2 的所有闭包。但在我的特定用例中,我需要允许深度为 8 的闭包。

使用这种类型的查询,我可以尝试:

SELECT   i,j,v FROM T WHERE i='x'

union

SELECT R.i "i",T.j "j",R.R.x+T.v "x" FROM T JOIN (SELECT R.i,T.j,R.v+T.v "x" FROM T JOIN T AS 
R ON R.j=T.i where R.i='x') AS R ON R.j=T.i where R.i='x'

union

SELECT R.i "i",T.j "j",R.v+T.v "x" FROM T JOIN T AS R ON R.j=T.i where R.i='x';

i|j|v
x|a|2
x|b|2
x|c|3
x|y|1
x|z|1

这将返回深度为 3 的闭包,但有冗余的选择查询。有没有更好的方法来找到闭包?

4

0 回答 0