それ自体を参照する階層を格納するために使用されるテーブルがあります。親のノード タイプを決定する SQL ステートメントが必要です。以下に、テーブルの構造とサンプルデータを示して、理解しようとしていることを最もよく説明しています。
ノード テーブル
CREATE TABLE IF NOT EXISTS NODES(id INTEGER PRIMARY KEY AUTOINCREMENT, type TEXT NOT NULL, parent_id INTEGER REFERENCES NODES(id) ON DELETE CASCADE
注: parent_id
ROOT ノードを参照するために NULL にすることができます。
サンプルデータ
INSERT INTO NODES(type, parent_id) VALUES('GRP', NULL); -- id: 1, title: Hello, World!
INSERT INTO NODES(type, parent_id) VALUES('TXT', 1); -- id: 2, title: Print
INSERT INTO NODES(type, parent_id) VALUES('RND', 1); -- id: 3, title: Random Output
INSERT INTO NODES(type, parent_id) VALUES('TXT', 3); -- id: 4, title: OUTPUT #1
INSERT INTO NODES(type, parent_id) VALUES('TXT', 3); -- id: 5, title: OUTPUT #2
INSERT INTO NODES(type, parent_id) VALUES('TXT', 3); -- id: 6, title: OUTPUT #3
コメントに記載した各ノードのタイトルがありますが、使いやすさのためにコメントに入れただけです。私が探しているのは、すべてを返す単一の SQL ステートメントを持つことですが、親の属性を使用する OUTPUT #* です。
私の試み
SELECT id
FROM NODES
WHERE parent_id NOT IN (SELECT id
FROM NODES
WHERE type = 'RND');
私の試みはほとんどの場合うまくいきますが、parent_id は NULL になる可能性があるため、これを調査することJOIN
で、 a の方がはるかに優れた解決策であることがわかりました。SELF JOIN を希望どおりに機能させる方法がわかりません。