0
我是CTE的新手,我试图弄清楚这一点。 我有一个表格,用于存储所有合同,我拥有最新合同“合同A”的记录,我希望通过历史顺序回顾相关合同,以找到具有特定标准的最新合同,有时候它会是我已经拥有的合同。有时深一层,也许深达5层。我建了一个CTE,它限制了记录与“合同A”相关的记录,但它进入一个无限循环和SQL杀死它BTW,我使用SQL Server 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
无限循环已经解决,这是一个数据问题,最古老的契约的PrevContractOID指向一个新的契约,而不是空的。但我现在得到重复的记录。它不返回3条记录,而是每条记录返回6条记录。 – greektreat 2011-06-13 15:32:38