0
從這裏跟進:Getting lowest level in a tree from any higher level with a self-join拼合分級表
我意識到,我其實是問錯了問題。我有一個分級表看起來是這樣的:
Type | Code | Parent_Type | Parent_Code
4 | 123 | 2 | 1
4 | 234 | 2 | 1
6 | 1234 | 4 | 123
6 | 2345 | 4 | 234
7 | 12345 | 6 | 1234
7 | 23456 | 6 | 1234
7 | 34567 | 6 | 2345
它映射「2型」代碼「式4」,「4型」向「6類」和「類型6」至「7型」 。前面的問題(和答案)處理了如何選擇任何單個父代碼下的所有類型7代碼。因此,例如,如何獲得類型2下代碼爲1的所有類型7代碼。
但我實際上需要做的是將此表與類型和代碼列表結合在一起。因此,例如,我可能有一個表:
Type | Code
4 | 123
6 | 7851
什麼,我需要做的就是既那些代碼下的所有7級代碼。換句話說,(我想)我需要層次扁平化弄成這個樣子:
Type | Code | Parent_Type | Parent_Code
7 | 12345 | 2 | 7
7 | 23456 | 2 | 7
7 | 34567 | 2 | 7
7 | 12345 | 4 | 123
7 | 23456 | 4 | 123
7 | 34567 | 4 | 234
7 | 12345 | 7 | 12345 // Note: these last three might not
7 | 23456 | 7 | 23456 // be strictly needed
7 | 34567 | 7 | 34567
於是我可以這樣做:
select p.type, p.code from myOtherTable o join mytable p on o.type = p.parent_type
and o.code = p.parent_code
要嘗試和扁平原始表,我已經嘗試了一些關於我原來的問題的答案,但沒有真正的運氣。例如:
with cte
as (
select p.type, p.code, p.parent_type, p.parent_code
from mytable as p
where parent_type = 2
union all
select c.type, c.code, c.parent_type, c.parent_code
from mytable as c
inner join cte on c.parent_code = cte.code
)
select *
from cte
沒有任何用處不是搞糟表的排序其他,如果我只是直接調用:
select * from mytable
謝謝,但是這並不能產生所需的輸出。它只返回兩行,不包括我需要能夠與另一個表連接的'parent_type'和'parent_code'。 – 2014-09-11 12:58:45
@MattBurland:它只返回兩條記錄,因爲你正在搜索的記錄(6/7851)中的一條記錄在樣本數據中不存在,所以它只能找到4/123的後代。添加'parent_type'和'parent_code'列是微不足道的。 – 2014-09-11 15:37:33
哦,等等,我很抱歉,我完全誤解了你發佈的內容。我沒有意識到你的小提琴已經加入了它。 – 2014-09-11 15:49:16