在SQLite中深度优先搜索

时间:2014-04-29 07:41:35

标签: sqlite infinite-loop

我试图在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;

我的问题是结果是无限循环,如下图所示: enter image description here

1 个答案:

答案 0 :(得分:0)

您的第二条记录将1与自身联系起来;查询正确报告此无限循环。

通常情况下,使用UNION代替UNION ALL可以避免重复,但在这种情况下这不起作用,因为level值不同。 您必须在WHEREtable1.id_parrent <> table1.id_child)中过滤掉这些循环,但如果存在较大的循环(例如1→2→1),则这不容易实现。