2013-10-08 101 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文檔。 –

相關問題