2013-10-08 63 views
1

比方说,我有一个名为“父”的列引用同一个表中的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是祖先。

我在想,如果有可能做到这一点在单个查询:)

+1

的可能重复(http://stackoverflow.com/questions/7456957/basic-recursive-query -on-sqlite3) –

+0

@Anna K.我添加了更新 –

回答

1

我不认为你可以在单个查询做到这一点,但recursive_triggers(SQLite的> = 3.6.18),你可以用它做固定数量的报表。

检查这个(其中tt是你的表名):?在sqlite3的基本递归查询]

-- 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; 
+0

创建表和插入看起来非常昂贵:P –

+0

@AnnaK。是的!但是很简单的SQLite。使用内存临时表,或许SQLite引擎获得最佳性能比其他程序化解决方案... –

-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 
) 
+0

请更改您的链接以指向相关的SQLite文档。 –

相关问题