2016-01-03 13 views
1

我需要得到家長和來自同一個表中的所有孩子......SQL服務器遞歸父/子同臺使用相同的字段

當運行此查詢:

select location, children from lochierarchy where parent ='HSAGCF' 

這個結果:

Location Children 
-------- ------------ 
HSAGCFSMF 1 
HSAGEE  1 
HSAGGAI  0 
HSAGPO  1 
HSAGSA  1 
HSAGSACC 1 
HSAGSAFR 0 
HSAGSARV 0 
HSAGSASG 0 
HSAGSC  1 
HSAGSD  1 
HSAGSI  1 
HSAGSO  1 
HSAGSR  0 
HSAGST  0 
HSAGSTTO 0 

當位置有孩子= 1有層次

更多的孩子如何做一個遞歸即得到Ë ACH這個位置上面的查詢,讓孩子= 1,並再次運行這樣的查詢:

select location 
    from lochierarchy 
where parent in ('HSAGCFSMF', 'HSAGEE', 'HSAGGAI', 'HSAGPO', 'HSAGSA', 
        'HSAGSACC','HSAGSAFR', 'HSAGSARV', 'HSAGSASG', 'HSAGSC', 
        'HSAGSD', 'HSAGSI', 'HSAGSO', 'HSAGSR', 'HSAGST', 
        'HSAGSTTO', 'HSAGSV', 'HSAGU1', 'HSAGU2', 'HSAGU3', 'HSAGU4') 


locations  Children 
---------- ------------ 
HSAGCFSMF  1 
HSAGEE   1 
HSAGGAI   0 
HSAGPO   1 
HSAGSA   1 
HSAGSACC  1 
HSAGSAFR  0 
HSAGSARV  0 
HSAGSASG  0 
HSAGSC   1 
HSAGSD   1 
HSAGSI   1 
HSAGSO   1 
HSAGSR   0 
HSAGST   0 
HSAGSTTO  0 
HSAGSV   0 

這遞歸需要被repeted,直到孩子的所有位置是= 0

+0

現在你的問題還不夠清楚。它沒有解釋父母和孩子之間的聯繫(除了0,1字段)。它是位置字段的字母嗎?還有什麼?請好好解釋一下。 –

+1

@JorgeCampos:沒有,只是沒有明確。查看OP最初運行的查詢:'選擇位置,來自lohlrarchy的子節點,其中parent ='HSAGCF'。這意味着有一個父列保存當前行的父項。 –

+0

哦,你說的對@本哲,謝謝。 –

回答

1

如果你在2005年或SQL更大,您可以使用遞歸公用表表達式。類似這樣的:

declare @parent varchar(20) = 'HSAGCF'; 

with cte as (
    select location, parent 
    from lochierarchy 
    where location = @parent 

    union all 

    select c.location, c.parent 
    from lochierarchy as c 
    join cte as p 
     on c.parent = p.location 
) 
select * 
from cte; 

如果你想要一個樹中葉節點的路徑,我把它作爲讀者的練習。