2010-01-12 2 views
0

에 삽입하면 같은 (SQL 서버 2005)SQL 서버 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 

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

을 그래서 기본적으로 :이 결과는 대신 설정 얻을 것이다 있도록 초기 자식 ID를 저장하려면 어떻게

제가 ... 원래 자식 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

+0

한 번만 발생합니다. 그 이상의 일이 일어나기를 원한다면, 우리는 당신이 가지고있는 것에 대해 당신이 가지고있는 것과 당신이 그것을하고 싶은 것에 대해 더 많은 정보를 주어야만합니다. –

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

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과 조심해야 할 한 가지는 예제 데이터에 null이 없었기 때문에 0 인 pairid를 기반으로 앵커 쿼리를 제한했습니다. 너의 앵커를 빼내기 위해 널 체크가 필요하다면 이것은 쉽게 바뀌어야한다.

그런 다음 앵커 쿼리에서 첫 번째 childId를 보유하는 추가 열 OriginalId와 부모 관계를 간단히 조인합니다.

+0

'Hierarchy'오류를 수정하고 IDE를 실행하면 오류가 무엇인지 알 수 없습니다. 다른 문제는 이들이 이러한 종류의 관계가있는 이러한 항목이 많다는 것입니다. 위의 내용은 단지 저조한 예일뿐입니다. – flavour404

+0

IDE가 충돌합니다! 경영 스튜디오를 의미합니까? 제공된 코드가 제공된 데이터에서 제대로 실행됩니다. 문제가 데이터에 관한 것이 될 수 있습니까? Visual Studio에서이 코드를 실행하는 경우 최대 재귀가 발생했을 때 발생하는 오류를 제대로 처리하지 못할 수 있습니다. –

+0

그건 사실이고, 예, 나는 이것을 Visual Studio에서 돌리고 있습니다. 위의 예는 하나의 작은 예이며 원본 쿼리를 사용하여 데이터 세트에 800 개의 행을 반환했습니다. 위의 쿼리를 사용할 수 없습니다. 미안하지만 여전히 새로운 개념입니다. – flavour404