Повторный просмотр истории записей, чтобы найти нужную запись

#common-table-expression

#общее табличное выражение

Вопрос:

Я новичок в CTE и пытаюсь разобраться в этом. У меня есть таблица, в которой хранятся все контракты, у меня есть запись о самом текущем контракте «Contract A», и я хочу вернуться к связанным контрактам в хронологическом порядке, чтобы найти последний контракт, у которого были определенные критерии, иногда это будет контракт, который у меня уже есть. Иногда глубиной в один уровень и, возможно, до 5 уровней. я создал CTE, и он ограничил записи записями, связанными с «Контрактом A», но он переходит в бесконечный цикл, и sql его уничтожает Кстати, я использую 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. бесконечный цикл был решен, это была проблема с данными, PrevContractOID самого старого контракта указывал на более новый контракт вместо того, чтобы быть нулевым. но теперь я получаю повторяющиеся записи. Вместо возврата 3 записей возвращается 6, причем каждая из двух является одной и той же записью.

Ответ №1:

Итак, этот код работал так, как предполагалось, это были все проблемы с данными. после устранения проблемы это работает отлично!