我试图在SQLite中实现深度优先搜索: 我有下表:
CREATE TABLE table1(id INTEGER PRIMARY KEY ,id_parrent INTEGER ,id_child INTEGER );
INSERT INTO table1(id_parrent,id_child) VALUES('1','4');
INSERT INTO table1(id_parrent,id_child) VALUES('1','1');
INSERT INTO table1(id_parrent,id_child) VALUES('1','3');
INSERT INTO table1(id_parrent,id_child) VALUES('1','2');
INSERT INTO table1(id_parrent,id_child) VALUES('2','8');
INSERT INTO table1(id_parrent,id_child) VALUES('2','7');
INSERT INTO table1(id_parrent,id_child) VALUES('2','3');
INSERT INTO table1(id_parrent,id_child) VALUES('2','6');
INSERT INTO table1(id_parrent,id_child) VALUES('2','10');
INSERT INTO table1(id_parrent,id_child) VALUES('2','5');
INSERT INTO table1(id_parrent,id_child) VALUES('2','9');
INSERT INTO table1(id_parrent,id_child) VALUES('2','2');
我尝试使用以下查询进行深度优先搜索:
WITH RECURSIVE
under_parrent(id_child,level) AS (
VALUES('1','0')
UNION ALL
SELECT table1.id_child, under_parrent.level+1
FROM table1,under_parrent
WHERE table1.id_parrent = under_parrent.id_child
ORDER BY 2 DESC
)
SELECT id_child FROM under_parrent;
我的问题是结果是无限循环,如下图所示:
答案 0 :(得分:0)
您的第二条记录将1
与自身联系起来;查询正确报告此无限循环。
通常情况下,使用UNION
代替UNION ALL
可以避免重复,但在这种情况下这不起作用,因为level
值不同。
您必须在WHERE
(table1.id_parrent <> table1.id_child
)中过滤掉这些循环,但如果存在较大的循环(例如1→2→1),则这不容易实现。