2015-04-14 54 views
0

仍然在學習SQL :) 這次我想從表格中走出一個'鏈接列表'走路,我想用CTE。 儘管網絡上的所有例子,我無法找到一個簡單的例子,我可以從那裏偷窺並從那裏開始。使用cte的行走列表

這裏是我的表

create table yo (id integer, nx integer) 
select * from yo 
id   nx 
---------- ---------- 
1   5 
2   4 
3   7 
4   9 
5   3 
6   0 
7   0 
8   6 
9   8 

我想從以下喲下一個環節發出啓動「身份證」

「NX」獲得「身份證」,「NX」名單因此,開始「ID」爲1會產生

id   nx 
---------- ---------- 
1   5 
3   7 
5   3 
7   0 

請注意,0是結束標記。

我找不到魔術SQL用於提前做這個 感謝名單 乾杯, 披

+0

我的表格在我最初的問題中出現亂碼dunno ho w編輯我的無意義帖子 – Phi

+0

這與典型的父母/子女關係相同。究竟是什麼問題? –

+1

修正了我在主要問題中的表格顯示(抱歉)。 CL沒有問題,(我認爲),但它是我在初學者,我試圖'複製'在網上給出的例子,但有太複雜,我不能使它的工作。我的意思是我無法制作SQL語句來獲取從鏈中某個點開始的(id,nx)列表。 – Phi

回答

2

名單的第一行很簡單:

SELECT id, nx 
FROM yo 
WHERE id = 1 

如果其中的nx列以前的條目可用list.nx,下列條目可以用此查詢返回:

SELECT yo.id, yo.nx 
FROM yo 
JOIN list ON yo.id = list.nx 

然後,只需插上這些結合在一起:

WITH RECURSIVE list(id, nx) AS (
    SELECT id, nx 
    FROM yo 
    WHERE id = 1 
    UNION ALL 
    SELECT yo.id, yo.nx 
    FROM yo 
    JOIN list ON yo.id = list.nx 
) 
SELECT * FROM list 

(因爲沒有排在那裏id爲零,這樣會自動停止; )

+0

Thanx CL,我幾乎在那裏輕鬆地加入。它像冠軍一樣運行,我可以用WHERE list.nx!= 1來處理循環列表(假設orignal註定要使條目7指向1而不是beiing 0.)再次thanx。 – Phi

+0

更好的方法來防止無限循環使用UNION而不是UNION ALL(請參閱[documentation](http://www.sqlite.org/lang_with.html))。 –