2011-12-26 38 views
2

表:如何在一個SQL查詢中獲取任意遞歸深度的祖先ID?

id parent_id 
    -------------- 
    a_1 NULL 
    a_2 NULL 
    b_1 a_1 
    c_1 b_1 
    d_1 c_1 

現在,我有ID:d_1

我怎樣才能得到a_1b_1c_1在一個SQL查詢? (d_1的祖先ID)?

+1

你的意思是D_1的祖先IDS。 d_1的父母標識是c_1,但您需要d_1的所有祖先。 (你可能想編輯你的問題來澄清這一點)。這是SQL不能很好地執行(處理任意級別的層次結構),儘管某個專家可能有一個解決方案。 – 2011-12-26 18:32:25

+0

你有固定的最大遞歸深度嗎? – 2011-12-26 18:32:54

+1

@AlbinSunnanbo好問題,我只是帶着問題的字面意思。我想用LEFT JOIN和[最大遞歸深度]連接數可能有足夠的靈活性。對於父母的未定義的數字......我真的很想看到有人怎麼會爲 – Nicolas78 2011-12-26 18:36:25

回答

1

我真的不認爲你可以做到這一點在一個簡單的SQL語句中,這是SQL語言的一個基本限制。

Here是,它大概你想要什麼(對於SQL Server)十惡不赦的存儲過程。所以你需要做這樣的事情。

2
SELECT c.id, b.id, a.id 
FROM T 
INNER JOIN T AS c on T.parent_id=c.id 
INNER JOIN T AS b ON c.parent_id = b.id 
INNER JOIN T as a ON b.parent_id = a.id 

假設你的表名爲T.但未經測試。不知道如果d沒有三個父母會發生什麼,可能你沒有得到一個東西,可能會嘗試LEFT JOIN爲這些情況獲得偉大的父母的NULL值。此外,最後一個JOIN並不是真的必要的,因爲你可以簡單地選擇b.parent_id而不是a.id,但是,你知道,只是爲了開車回家的模式;)

+0

注意這假定層次結構的固定深度。 – 2011-12-26 18:36:21

+0

啊,看到我的評論上面,我把面值的問題,這可能是無趣的一部分;然而與LEFT JOIN的這種改變至少一個唯一的固定最大深度 – Nicolas78 2011-12-26 18:36:53

+0

如果'd_1'的祖先IDS超過3個,這是可以工作? – Koerr 2011-12-26 18:37:34