2017-10-14 13 views
1

私は子IDとその親IDのSQLiteテーブルを持っています。与えられた親が子の列に表示される場所。たとえば:究極の親を再帰的なCTEで見つける

child parent 
----- ------ 
3  4 
2  3 
1  2 
5  4 
7  8 
6  7 

私は子供が1列に表示され、その最終的な親会社(すべてrecusingが完了した後に残る親が)にリストされているテーブルに再帰構造からこれを変換したいですその他。例えば、上記の表は、につながる:

child ultimate_parent 
----- --------------- 
3  4 
2  4 
1  4 
5  4 
7  8 
6  8 

私は、これはSQLites再帰CTEを使用して可能でなければならないことを理解し、私はトラブルクエリを開発したのです。以下は今まで私が持っていたものですが、明らかに不完全です。

WITH RECURSIVE rel(child, parent) AS (
     SELECT child, parent FROM relationships 
     UNION ALL 
     SELECT child, parent FROM rel 
    ) 
    SELECT * FROM rel; 

ご協力いただければ幸いです。

再帰ステップが次のステップのためのデータを計算するために前のステップと、元のテーブルからのデータを使用しなければならない

PRAGMA foreign_keys=OFF; 
BEGIN TRANSACTION; 
CREATE TABLE `relationships` (
    `child` INTEGER, 
    `parent` INTEGER 
); 
INSERT INTO relationships VALUES(3,4); 
INSERT INTO relationships VALUES(2,3); 
INSERT INTO relationships VALUES(1,2); 
INSERT INTO relationships VALUES(5,4); 
INSERT INTO relationships VALUES(7,8); 
INSERT INTO relationships VALUES(6,7); 
COMMIT; 
+0

は '作成の' .dump'(すなわちラインとしてデータベース構造とstuitably合わせたおもちゃのデータベースのサンプルコンテンツを提供してください。テーブル...」と「入れて...」)。 – Yunnosch

答えて

0

上記の例のテーブルのダンプ:

そしてCTEはすべての可能な直接的および間接的な親を生成する。あなたは究極の両親をフィルタリングする必要があり、すなわち、子供ではありませんそれらの両親:

WITH ... 
SELECT * 
FROM rel 
WHERE parent NOT IN (SELECT child 
        FROM relationships); 
+0

ありがとう!私は何とか前のステップを使って次のステップを使う必要があることを知っていましたが、そのように見えたのか分かりませんでした。 。 。今私がやります。 – Chris

関連する問題