2010-01-12 19 views
0

插入比方說你有一個表作爲這樣的(SQL SERVER 2005)的SQL Server 2005 - CTE,保留值和數據集

pairID childID parentID 
0  1  2 
1  2  3 
2  3  4 

你的CTE返回此數據集:

pairID childID parentID level 
0  1  2  2 
1  2  3  1 
2  3  4  0 

你如何保存初始子ID,這樣你會得到這樣的結果,而不是設置:

pairID childID parentID level 
0  1  2  2 
1  1  3  1 
2  1  4  0 

所以基本上什麼我做的是保持原來的子ID並返回一個,而不是其他...

這是CTE查詢到今天爲止,它完美的作品:

WITH TESTER AS (SELECT a.PairID, 
       a.ChildID, 
       a.ParentID, 
       0 AS Level 
       FROM 
       BusinessHierarchy AS a 
       LEFT OUTER JOIN BusinessHierarchy AS a2 
       ON a.ParentID = a2.ChildID 
       WHERE (a2.PairID IS NULL) 
       UNION ALL 
       SELECT b.PairID, b.ChildID, b.ParentID, oh.Level + 1 AS Level 
       FROM BusinessHierarchy AS b INNER JOIN 
       TESTER AS oh ON b.ParentID = oh.ChildID) 
SELECT PairID, ChildID, ParentID, Level 
FROM TESTER AS x 
ORDER BY Level, ChildID, ParentID 

回答

0

你可以得到,如果第一(變成一個變量),然後再使用變量。

DECLARE @StartingId int 

SELECT 
    @StartingId = a.PairID 
FROM BusinessHierarchy AS a 
LEFT OUTER JOIN BusinessHierarchy AS a2 ON a.ParentID = a2.ChildID 
WHERE (a2.PairID IS NULL) 


WITH TESTER AS (SELECT a.PairID, 
      a.ChildID, 
      a.ParentID, 
      0 AS Level 
      FROM 
      BusinessHierarchy AS a 
      WHERE (a.PairID = @StartingId) 
      UNION ALL 
      SELECT b.PairID, b.ChildID, b.ParentID, oh.Level + 1 AS Level 
      FROM BusinessHierarchy AS b INNER JOIN 
      TESTER AS oh ON b.ParentID = oh.ChildID) 

SELECT PairID, @StartingId, ParentID, Level 
FROM TESTER AS x 
ORDER BY Level, ChildID, ParentID 
+0

這不是隻發生過一次@StartingID的初始人口嗎?每個不同的層次組會發生什麼? – flavour404 2010-01-12 02:45:21

+0

它只發生一次。如果你想讓它發生更多的事情,你必須給我們提供更多關於你在桌面上有什麼以及你想要做什麼的信息。 – 2010-01-12 03:12:49

0

未經測試,但你試過嗎?

;WITH My_CTE AS 
(
    SELECT 
      BH1.PairID, 
      BH1.ChildID AS BaseID, 
      BH1.ChildID, 
      BH1.ParentID, 
      0 AS Level 
    FROM 
      BussinessHierarchy BH1 
    LEFT OUTER JOIN BussinessHierarchy BH2 ON 
      BH1.ParentID = BH2.ChildID 
    WHERE 
      BH2.PairID IS NULL 
    UNION ALL 
    SELECT 
      BH3.PairID, 
      CTE.BaseID, 
      BH3.ChildID, 
      BH3.ParentID, 
      CTE.Level + 1 AS Level 
    FROM 
      My_CTE CTE 
    INNER JOIN BussinessHierarchy BH3 ON 
      BH3.ParentID = CTE.ChildID 
    ) 
SELECT 
    PairID, 
    BaseID, 
    ParentID, 
    Level 
FROM 
    My_CTE 
ORDER BY 
    Level, 
    BaseID, 
    ParentID 
+0

我這樣做了,但在調試錯誤之前,它只是不斷崩潰我的IDE。我會繼續嘗試。 – flavour404 2010-01-12 02:03:53

0

你寫的CTE只是把我搞糊塗了我害怕,所以我重寫了它,如下所示,它給出了你所要求的結果。這是否符合您的要求?

WITH List (pairID, childId, parentId, level, originalid) 
AS 
(
    -- Anchor member definition 
    select pairID, childID, parentID, 0 as level, ChildID as originalid 
    FROM  
    BusinessHeirarchy bh 
    where bh.PairID = 0 


    UNION ALL 

    -- Recursive member definition 
    select j.pairId, j.childID, j.parentID, lst.level +1 as level, lst.originalid 
    from BusinessHeirarchy j inner join List lst 
    on (lst.parentId = j.ChildID) 

) 

select * from list; 

可以很明顯的與輸出列,因爲你需要的順序播放,但你想要的數據相匹配。

有一件事要注意我的SQL是我限制基於零pairid的錨查詢,因爲您的示例數據沒有空值。這應該很容易改變,如果你需要空檢查拔出你的錨點。

然後,我只需加入父對子關係,並使用附加列OriginalId來持有錨定查詢中的第一個childId。

+0

不確定錯誤是什麼,當我糾正'Hierarchy'錯誤並運行它時,我的IDE崩潰了。另一個問題是,他們是這些關係中的很多這些項目,上面只是一個低端的例子。 – flavour404 2010-01-12 02:21:18

+0

你的IDE崩潰了?你的意思是管理工作室?所提供的代碼在提供的數據上運行良好。這個問題可能與數據有關嗎?如果你是從Visual Studio運行它,可能是它不能很好地處理最大遞歸命中時引發的錯誤。 – 2010-01-12 02:26:25

+0

這是真的,是的,我在視覺工作室運行這個。上面的例子是一個小例子,我使用原始查詢在我的數據集中返回了800行,我無法獲得上面的工作,對不起,這對我來說仍然是一個新概念。 – flavour404 2010-01-12 02:44:01