2016-11-19 59 views
-1

我有類似下面的相當簡單的自我引用的表:獲取給定元素的所有後代在MySQL

表1

id  parent_id 
1  NULL 
2  1 
3  NULL 
4  1 
5  2 
6  5 
7  2 
8  4 

我需要生成一個新的表,其中每個元素,他們的後代都是相關聯的。看到這個例子:

表2

element descendants 
1  2 
1  5 
1  6 
1  7 
1  4 
1  8 
2  5 
2  6 
2  7 
5  6 
4  8 

注意3不存在,因爲它沒有任何孩子。

如何使用存儲過程實現此目的?我可以得到一個直接的親子關係,但是我很難得到給定元素的所有後代。

(現實世界的表是〜15K行&〜7級層次結構,但它水平未預先定義所以讓我們假設爲N)

+0

可能的複製[分層SQL問題](http://stackoverflow.com/questions/1336318/hierarchical-sql-question) – Ben

+0

@Ben這是甲骨文,我正在與MySQL工作 –

回答

1

這可以用遞歸CTE來完成。 MySQL現在支持遞歸CTE,如MySQL Server Blog中所述。

假設一個名爲「SELF_REF」表,遞歸CTE會是這樣的:

with recursive ref(element, descendant) as (
select parent_id, id from self_ref 
union 
select element, id 
from ref as r 
    inner join self_ref as s on s.parent_id = r.descendant 
where parent_id is not null 
) 
select element, descendant from ref 
where element is not null 
order by element, descendant; 

(這是專門用於Postgres寫的,但如果不相同MySQL的語法類似。)

+0

這是在MySQL 8的新功能嗎?我正在使用5.7 –

+0

是的。如果無法升級,考慮將數據複製到支持遞歸CTE的DBMS,在那裏完成工作,然後將數據複製回MySQL。 Postgres的本地安裝可以爲你服務。 –