假设我有一个名为“parent”的列引用同一个表中的ID列。 所以它可以清空或数字。如果它为空则表示该记录没有父级。
示例:
ID name parent
1 A
2 B 1
3 C 2
4 D 2
获取C的祖先我做了两个查询:
SELECT parent FROM table WHERE id = 2
SELECT parent FROM table WHERE id = 1
然后我得到空父母所以我知道1是祖先。
我想知道是否可以在一个查询中执行此操作:)
答案 0 :(得分: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;
答案 1 :(得分:-1)
是的,使用Recursive 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
)