2017-04-25 32 views
-1

我想使用一個CTE內聯,就像一個函數,但我不能創建一個函數,因爲我只能讀取數據庫的訪問權限。還有其他的方法可以簡單地做到嗎?在SQL中內聯使用輸出CTE?

查詢:

SELECT SuiteID,ParentSuiteID FROM tbl_Suite; 

中的結果是這樣的:

 
SuiteID ParentSuiteID 
1 0 
4 1 
5 4 
6 4 
7 4 
8 4 
9 4 
10 4 
11 4 

現在我要尋找其中一個結果:

 
SuiteID ParentSuiteID Level1ParentID 
1 0     0 
4 1     0 
5 4     1 
6 4     1 
7 4     1 
8 4     1 
9 4     1 
10 4     1 
11 4     1 
與下面的CTE

,我能取得Level1Parent,如果我通過SuiteID

;WITH HIERARCHY AS 
(select T1.SuiteID,T1.Title,T1.ParentSuiteID, 0 Level FROM tbl_Suite(nolock) T1 
    Where T1.ParentSuiteID = 0 AND T1.PlanID = '404' 
    UNION ALL 
    select T2.SuiteID,T2.Title,T2.ParentSuiteID,Level+1 
    from tbl_Suite(nolock) AS T2 
    INNER JOIN HIERARCHY AS H 
    ON T2.ParentSuiteID = H.SuiteID 
) 

,CTE_A(SuiteID,Title,ParentSuiteID,Level) AS 
(
    select H2.SuiteId, H2.Title, H2.ParentSuiteId, H2.Level 
    from Hierarchy H2 
    --INNER JOIN #X_Temp X 
    --ON H2.SuiteID = X.SuiteID 
    where H2.SuiteID = 10820 
    UNION ALL 
    select H2.SuiteId, H2.Title, H2.ParentSuiteId, H2.Level 
    from Hierarchy H2 JOIN CTE_A On H2.SuiteID = CTE_A.ParentSuiteID 
) 

SELECT SuiteID FROM CTE_A WHERE level = 1 

我的問題是:

A)我如何通過SuiteID作爲內聯子查詢遞歸查詢CTE? B)如何組合如上所示的結果集?

+2

在繼續亂拋垃圾查詢之前,您可能需要仔細閱讀本文。 http://blogs.sqlsentry.com/aaronbertrand/bad-habits-nolock-everywhere/ –

+0

真正有幫助的是,如果您可以爲您的表和樣本數據提供ddl以及所需的輸出。因爲現在第一個查詢過於冗長而且難以辨認,而且我不清楚你想要做什麼。這將是一個很好的開始。 http://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/ –

+0

嗨,肖恩,在第一個查詢中我試圖獲取結果集上我打算申請聚合。只有列SuiteID對於此查詢非常重要,因爲它具有父級子關係,所以我需要爲每個SuiteID找到第二級父級,這是以下CTE所做的。我無法做的就是將這兩個代碼組合成一個輸出作爲單個結果集。 – Sharktooth

回答

0

仍然不完全確定你想在這裏,但我認爲你已經有99.99999%的代碼。理想情況下,你會發布一些消費數據。沿着這些路線。

create table #tbl_suite 
(
    SuiteID int 
    , ParentSuiteID int 
) 

insert #tbl_suite 
select 1, 0 union all 
select 4, 1 union all 
select 5, 4 union all 
select 6, 4 union all 
select 7, 4 union all 
select 8, 4 union all 
select 9, 4 union all 
select 10, 4 union all 
select 11, 4 

然後,所有人都必須做的工作就是查詢而不是設置和查詢。使用你的cte這已經完成了。我不得不刪除Title和PlanID,因爲它們不在您的新示例數據中。

WITH HIERARCHY AS 
( 
    select T1.SuiteID 
     --, T1.Title 
     , T1.ParentSuiteID 
     , 0 Level 
    FROM #tbl_Suite(nolock) T1 
    Where T1.ParentSuiteID = 0 
     --AND T1.PlanID = '404' 
UNION ALL 
    select T2.SuiteID 
     --, T2.Title 
     , T2.ParentSuiteID 
     , Level + 1 
    from #tbl_Suite(nolock) AS T2 
    INNER JOIN HIERARCHY AS H ON T2.ParentSuiteID = H.SuiteID 
) 
select SuiteID 
    , ParentSuiteID 
    , case when Level = 0 then Level else Level -1 end as Level 
from HIERARCHY 
+0

嗨,肖恩,我想我想在我以前的查詢中將結果集作爲一個新列,因爲我必須確定每個suiteid的第一個父項。不知道我是否解釋這個權利。你看,一個suiteid可以捲到一個父母身上,這個父母又會有一個父母,這個母親會再次彙總,直到達到根。必須爲所有記錄調用CTE以確定L1Parent記錄。我明白,這一定很混亂。 – Sharktooth

+0

好於發佈一些表示問題的示例數據,期望的輸出和解釋。 –

0

我不確定我是否瞭解您的數據。 SuiteId在0級或1級上是否爲1?

在你的ResultSet

SuiteID ParentSuiteID Level1ParentID 
1 0     0 
4 1     0 
5 4     1 
6 4     1 
7 4     1 
8 4     1 
9 4     1 
10 4     1 
11 4     1 

您返回SuiteID = 1爲Level1ParentID會員在suiteid(5,...,11),但不會suiteid = 1是Suiteid = 4 level1parent?

如果SuiteID = 4是1級,那麼你resutl應該是:

SuiteID ParentSuiteID Level1ParentID 
1 0     0 
4 1     0 
5 4     4 
6 4     4 
7 4     4 
8 4     4 
9 4     4 
10 4     4 
11 4     4 

這段代碼給出所需的結果。我使用您的原始CTE作爲層次結構,並在層次結構中記錄Level1ParentId。

如果我們開始與suiteid = 1爲1級,然後我們得到這樣的結果:

SuiteID ParentSuiteID Level1ParentId 
1 0 0 
4 1 1 
5 4 1 
6 4 1 
7 4 1 
8 4 1 
9 4 1 
10 4 1 
11 4 1 

如果我們從0開始的水平,那麼我們得到:

SuiteID ParentSuiteID Level1ParentId 
1 0 0 
4 1 0 
5 4 4 
6 4 4 
7 4 4 
8 4 4 
9 4 4 
10 4 4 
11 4 4 

這是代碼:

;with tbl_Suite as 
(
select * from (values 
(1 , 0 ,'title 1' ,'404') 
,(4 , 1,'title 4' ,'404') 
,(5 , 4,'title 5' ,'404') 
,(6 , 4,'title 6' ,'404') 
,(7 , 4,'title 7' ,'404') 
,(8 , 4,'title 8' ,'404') 
,(9 , 4,'title 9' ,'404') 
,(10, 4,'title 10','404') 
,(11, 4,'title 11','404') 
) s(SuiteID,ParentSuiteID,Title,PlanId)) 
,HIERARCHY AS 
(select T1.SuiteID,T1.Title,T1.ParentSuiteID, 0 Level,0 Level1ParentId FROM tbl_Suite T1 
    Where T1.ParentSuiteID = 0 AND T1.PlanID = '404' 
    UNION ALL 
    select T2.SuiteID,T2.Title,T2.ParentSuiteID,Level+1 
    ,case when Level=1 then t2.ParentSuiteID else Level1ParentId end 
    from tbl_Suite AS T2 
    INNER JOIN HIERARCHY AS H 
    ON T2.ParentSuiteID = H.SuiteID 
) 
select a.SuiteID,a.ParentSuiteID,b.Level1ParentId from tbl_Suite a 
inner join HIERARCHY b 
on a.SuiteID=b.SuiteID