1

假设我有一个名为“parent”的列,它引用了同一个表中的 ID 列。所以它可以为空或一个数字。如果它为空,则表示该记录没有父记录。

例子:

ID  name  parent
1   A
2   B     1
3   C     2
4   D     2

要获得 CI 的祖先,请进行两个查询:

SELECT parent FROM table WHERE id = 2

SELECT parent FROM table WHERE id = 1

然后我得到空父,所以我知道 1 是祖先。

我想知道是否可以在单个查询中执行此操作:)

4

2 回答 2

1

我认为您不能在单个查询中完成,但使用recursive_triggers(SQLite>=3.6.18) 您可以使用固定数量的语句来完成。

检查这个(tt你的表名在哪里):

-- Schema addition:
PRAGMA recursive_triggers=1;
CREATE TEMP TABLE ancid(id UNIQUE, ancestor);
CREATE TEMP TRIGGER ancid_t AFTER INSERT ON ancid WHEN (SELECT parent FROM tt WHERE id=NEW.ancestor) IS NOT NULL BEGIN
    INSERT OR REPLACE INTO ancid SELECT NEW.id, parent FROM tt WHERE id=NEW.ancestor;
END;

-- Getting ancestor from id=3:
INSERT INTO ancid VALUES(3, 3);
SELECT * FROM ancid WHERE id=3;

-- Getting all ancestors:
INSERT OR REPLACE INTO ancid SELECT id, id FROM tt;
SELECT * FROM ancid;
于 2013-10-09T12:35:31.307 回答
-1

是的,有使用递归 CTE

本质上它会。这是伪代码,但它会让你达到 90%。如果你给我一些表定义,我可以为你做更多

;with coolCTE as (
SELECT id,NAME,1 as level
FROM tableX
where parent is null
union all
select id,name,level + 1
from tablex as y 
inner join coolcte as c on y.id = c.parentid
where y.parentid is not null
)
于 2013-10-08T18:07:41.077 回答