我有一个用于存储层次结构的表,它引用自身。我需要一个确定父节点类型的 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
可以为 NULL 以引用 ROOT 节点。
样本数据
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,我通过研究得知 aJOIN
将是一个更好的解决方案。我只是不知道如何让 SELF JOIN 以我想要的方式工作。