我可以在单个查询中获取祖先元素吗?

时间:2013-10-08 17:58:30

标签: sql sqlite foreign-keys parent-child hierarchy

假设我有一个名为“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是祖先。

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

2 个答案:

答案 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
)