2014-07-02 14 views
0

我有一個表,它包含以下列:id, text, parentid。並且當一行是根項目(不具有任何父項目)時,則parentid = 0在SQLite中實現某種簡單的循環

我想要做的,是找到一個特定項目的第一個根(根的項目根)的text

下面是一個例子:

SELECT parentid FROM cat WHERE id = 1234 --returns 1120 
SELECT parentid FROM cat WHERE id = 1120 --returns 1011 
SELECT parentid FROM cat WHERE id = 1011 --returns 0. So this the first root. 
SELECT text FROM cat WHERE id = 1011 --returns what I want. 

我知道這是很容易可能的循環,但我使用sqlite它不支持循環。

所以,問題是,有沒有辦法在sqlite中執行此操作,而不使用任何其他腳本?

+0

您可以使用[遞歸CTE(http://sqlite.org/lang_with.html) – Blorgbeard

+0

@Blorgbeard我不能啓動了解它是如何工作的。你能否再解釋一下,並將其作爲答案發布? –

+0

糟糕,在這個例子中出了點問題。 (最後一個查詢,數字應該是1101而不是1120)我剛剛編輯它。 –

回答

2

這個遞歸CTE會給你想要的結果。請注意,熱膨脹係數僅在SQLite的最新版本可以從version 3.8.3

;with cte as (
    select id, parentid, text, 1 level 
    from t where id = 1234 
    UNION all 
    select t.id, t.parentid, t.text, cte.level + 1 
    from cte inner join t on cte.parentid = t.id 
    where cte.parentid <> 0) 
select * from cte where parentid = 0 
+0

感謝您提到必要的SQLite版本。我不得不更新我的SQLite庫。 –