递归循环记录历史记录以查找所需记录

时间:2011-06-13 15:17:35

标签: common-table-expression

我是CTE的新手,我正试图解决这个问题。 我有一张表存储了我拥有最新合同“合同A”记录的所有合同,我想按历史顺序返回相关合同,以找到具有特定标准的最新合同,有时它将是合同我已经有了。有时深一级,可能深达五级。我建立了一个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

1 个答案:

答案 0 :(得分:0)

因此,此代码按预期工作,这是所有数据问题。用它解决它的效果很好!