문제

아래 코드에서는 SQL Server 2005의 재귀 CTE(공통 테이블 표현식)를 사용하여 기본 계층 구조의 최상위 부모를 찾으려고 합니다.이 계층 구조의 규칙은 모든 CustID에 ParentID가 있고 CustID에 상위가 없는 경우 ParentID = CustID이며 이것이 최고 수준이라는 것입니다.

DECLARE @LookupID int

--Our test value
SET @LookupID = 1

WITH cteLevelOne (ParentID, CustID) AS
(
        SELECT   a.ParentID, a.CustID
        FROM     tblCustomer AS a
        WHERE    a.CustID = @LookupID
    UNION ALL
        SELECT   a.ParentID, a.CustID
        FROM     tblCustomer AS a
        INNER JOIN cteLevelOne AS c ON a.CustID = c.ParentID
        WHERE c.CustID <> a.CustomerID
)

따라서 tblCustomer가 다음과 같다면:

ParentID    CustID
5            5
1            8
5            4
4            1

위 코드에서 얻은 결과는 다음과 같습니다.

ParentID    CustID
4            1
5            4
5            5

내가 원하는 것은 해당 결과의 마지막 행입니다.

ParentID    CustID
5            5

CTE에서 생성된 마지막 레코드(최고 수준 CustID)를 어떻게 반환합니까?

또한 이 테이블에는 관련되지 않은 CustID 계층이 여러 개 있으므로 SELECT * FROM tblCustomer WHERE ParentID = CustID를 수행할 수는 없습니다.ID 번호는 계층 구조와 관련이 없기 때문에 ParentID 또는 CustID로 주문할 수 없습니다.

도움이 되었습니까?

해결책

가장 높은 재귀 깊이를 원한다면 이렇게 할 수는 없나요? 그러면 실제로 CTE를 쿼리할 때 max(Depth)가 있는 행을 찾으세요.다음과 같습니다:

DECLARE @LookupID int

--Our test value
SET @LookupID = 1;

WITH cteLevelOne (ParentID, CustID, Depth) AS
(
        SELECT   a.ParentID, a.CustID, 1
        FROM     tblCustomer AS a
        WHERE    a.CustID = @LookupID
    UNION ALL
        SELECT   a.ParentID, a.CustID, c.Depth + 1
        FROM     tblCustomer AS a
        INNER JOIN cteLevelOne AS c ON a.CustID = c.ParentID 
        WHERE c.CustID <> a.CustID
)
select * from CTELevelone where Depth = (select max(Depth) from CTELevelone)

또는 trevor가 제안한 내용을 적용하면 동일한 CTE와 함께 사용할 수 있습니다.

select top 1 * from CTELevelone order by Depth desc

설명하신 경우 CustomerID가 반드시 주문하려는 것이 아니라고 생각하지만 질문에 대해서도 명확하지 않았습니다.

다른 팁

문제를 완전히 이해했는지는 확실하지 않지만 문제를 해결하기 위해 다음을 시도해 볼 수 있습니다.

SELECT TOP 1 FROM cteLevelOne ORDER BY CustID DESC

이는 CustID도 GUID와 같은 것이 아니라 예제와 같이 순서대로 되어 있다고 가정합니다.

먼저 부모 자식 중 하나라도 동일하면 CTE가 완료되지 않습니다.재귀적 CTE이므로 종료되어야 합니다.Parent와 cust ID가 같으면 루프가 끝나지 않습니다.

MSG 530, 레벨 16, 상태 1, 15 행 진술이 종료되었습니다.명령문이 완료되기 전에 최대 재귀 횟수 100이 소진되었습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top