簡體   English   中英

SQL Server 2008 R2:遞歸查詢

[英]SQL Server 2008 R2: Recursive query

這是以下問題: 准備一個遞歸查詢

我的表具有兩列,即可樂和colb,如下所示:

表:測試

create table Test
(
 cola int,
 colb int
);

我輸入的記錄是:

Cola   Colb
------------
1      2
1      3
1      4
2      5
2      6
2      3
3      2
3      4
3      7
3      10
10     11
11      12
11     13
11     14
12     15
13     16 
14     99
15     88
16     77

注意 :現在,我只想顯示與我通過的值相關的記錄。 例如,如果我將值傳遞為1,則它應該向我顯示連接的數字並像樹一樣形成連接。

對於以上要求,我從黑暗騎士那里獲得了腳本,如下所示,效果很好。

;WITH CTE AS
(
   SELECT COLA,COLB,','+CAST(COLA AS VARCHAR(MAX))+',' AS CHCK FROM test WHERE COLA=1
   UNION ALL
   SELECT C1.COLA,C1.COLB,C.CHCK+CAST(C1.cola AS VARCHAR(MAX))+','
   FROM CTE C INNER JOIN test C1 ON  C.colb = C1.cola
   WHERE CHARINDEX(','+CAST(C.colb AS VARCHAR(MAX))+',',C.CHCK)=0
),
OUTERCTE AS
(   
    SELECT DISTINCT COLA,COLB,ROW_NUMBER() OVER(PARTITION BY Colb ORDER BY Cola) rn FROM CTE --ORDER BY COLA
)
SELECT Cola,Colb FROM OUTERCTE
WHERE rn<=1
ORDER BY CASE WHEN Cola = 1 THEN 1 ELSE 2 END;

這給了我這個:

----------------
Cola        Colb
----------------
1           2   
1           3   
1           4   
2           5   
2           6   
3           7   
3           10  
10          11  
11          12  
11          13  
11          14  
12          15  
13          16  
16          77  
15          88  
14          99  

要求 :現在我想顯示記錄級別。

預期結果

    ------------------------------
    Cola        Colb        Level
    ------------------------------
    1           2           1
    1           3           1
    1           4           1
    2           5           2
    2           6           2
    3           7           2
    3           10          2
    10          11          3
    11          12          4
    11          13          4
    11          14          4
    12          15          5   
    13          16          5
    16          77          6
    15          88          6
    14          99          5
;WITH CTE AS
(
   SELECT COLA,COLB
                 ,','+CAST(COLA AS VARCHAR(MAX))+',' AS CHCK 
                , 1 as lvl FROM #Test WHERE COLA=1
   UNION ALL
   SELECT C1.COLA,C1.COLB  ,C.CHCK+CAST(C1.cola AS VARCHAR(MAX))+',' 
                            , c.lvl+1 
   FROM CTE C INNER JOIN #Test C1 ON  C.colb = C1.cola
    WHERE CHARINDEX(','+CAST(C.colb AS VARCHAR(MAX))+',',C.CHCK)=0 

),
cte2 as (
select * , ROW_NUMBER() over (partition by colb order by lvl)as rn From CTE
)
select cola,colb,lvl from cte2 where rn = 1

暫無
暫無

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

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