2011-06-13 3 views
0

저는 CTE를 처음 사용하고 있으며 이것을 파악하려고합니다. 나는 모든 계약서를 저장하는 테이블이 있습니다. 가장 최근 계약서 인 "계약서 A"에 대한 기록이 있으며, 관련 계약서를 통해 역사적인 순서로 돌아가 특정 기준을 가진 최신 계약서를 찾고자합니다. 계약서에 이미있다. 언젠가는 한 단계 깊고 아마도 다섯 단계까지 될 수 있습니다. 나는 CTE를 구축하며 "계약 A"와 관련된 기록에 기록을 제한하지만 무한 루프로 전환되고 SQL은 BTW 내가 가지고있는 코드를 SQL 서버 여기에 2008 이다 사용하고 그것을 죽이고 :원하는 레코드를 찾기 위해 레코드 기록을 통한 반복적 인 검색

CREATE TABLE #t_Contracts 
( ContractOID INT NOT NULL 
, SystemSourceOID SMALLINT NOT NULL 
) 

--"Contract A" 
INSERT #t_Contracts 
SELECT 7463027, 2 


WITH Contract_CTE (ContractOID, SystemSourceOID, PrevContractOID, ProductCodeType,Comment, Contractlevel) 
AS 
(
    --Anchor with "Contract A" 
    SELECT CON.ContractOID, CON.SystemSourceOID, CON.PrevContractOID, PRD.ProductCodeType, PRD.Comment, 0 AS Contractlevel 
    FROM UBASS.dbo.[Contract] AS CON 
    INNER JOIN #t_Contracts   AS TMP ON CON.ContractOID = TMP.ContractOID 
              AND CON.SystemSourceOID = TMP.SystemSourceOID 
    INNER JOIN UBASS.dbo.Product AS PRD ON CON.ProductOID = PRD.ProductOID 
              AND CON.SystemSourceOID = PRD.SystemSourceOID 
    UNION ALL 
    --"Contract A" Previous contracts 
    SELECT CON.ContractOID, CON.SystemSourceOID, CON.PrevContractOID, PRD.ProductCodeType, PRD.Comment, Contractlevel + 1 
    FROM  UBASS.dbo.[Contract] AS CON 
    INNER JOIN Contract_CTE AS pCON ON pCON.PrevContractOID = CON.ContractOID 
       AND CON.SystemSourceOID = pCON.SystemSourceOID 
    INNER JOIN UBASS.dbo.Product AS PRD ON CON.ProductOID = PRD.ProductOID 
              AND CON.SystemSourceOID = PRD.SystemSourceOID 

) 



SELECT * FROM Contract_CTE 
WHERE 
ProductCodeType NOT IN ('MPP','RBP','STP','RCP','BNE') 
AND Comment != 'RETENTION' 

--WHERE ContractOID = 7463027 AND SystemSourceOID = 2 
+0

infinte 루프가 해결되어 가장 오래된 계약의 PrevContractOID가 null 대신 새로운 계약을 가리키는 데이터 문제였습니다. 하지만 지금은 중복 된 레코드를 얻습니다. 3 개의 레코드를 반환하는 대신 6을 반환하며 각 레코드는 동일한 레코드입니다. – greektreat

답변

0

그래서이 코드는 의도 한대로 작동했으며 모든 데이터 문제였습니다. 그것으로 해결 된 것은 훌륭하게 작동합니다!

관련 문제