次のテーブルがあります:(私は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 では再帰クエリを使用できません。1 つのクエリを作成しようとしましたが、それを効率的に呼び出して目的の結果を得ることができません。
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 までのクロージャーが返されますが、選択クエリが冗長になります。閉鎖を見つけるためのより良い方法はありますか?