簡體   English   中英

SQL Server遞歸父/子相同表使用相同字段

[英]Sql Server Recursive parent/child same table using same field

我需要讓父母和所有孩子從同一張桌子...

運行此查詢時:

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時,子代中有更多子代

如何執行遞歸操作,以使此查詢的每個位置都高於其子代= 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

需要重復執行此遞歸操作,直到所有位置的子代均為= 0

如果您使用的是SQL 2005或更高版本,則可以使用遞歸公用表表達式。 像這樣:

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;

如果您想要通往樹中葉節點的路徑,我將其作為練習留給讀者。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM