Объединить CTE со ссылками друг на друга - PullRequest
0 голосов
/ 08 ноября 2019

У меня есть код, с которым я получаю помощь в другом вопросе, это как-то связано с этим, но только частично. Появилась мысль о замене курсора на что-то лучшее. Я подумал, что, возможно, CTE со слиянием, но мне трудно понять, как подключить использование в слиянии к моему cte. В моем коде ниже @REFCOUNTER был изначально от моего курсора. Теперь вместо использования курсора я думаю о слиянии, но как подключить использование при слиянии к @refcounter. Я надеюсь, что это имеет смысл.

CTE предназначен для поиска исходного значения счетчика, если есть последующие записи, ссылающиеся на него. Это своего рода переход от последней записи к оригинальной записи.

WITH n(COUNTER, REFCOUNTER) AS 
(
    SELECT 
            cnt.COUNTER, 
            cnt.REFCOUNTER 
    FROM 
            TCATMSTR_COUNTER cnt
    WHERE 
            cnt.COUNTER = @REFCOUNTER
UNION ALL
    SELECT 
            nplus1.COUNTER, 
            nplus1.REFCOUNTER 
    FROM 
            TCATMSTR_COUNTER as nplus1, 
            n
    WHERE 
            n.COUNTER = nplus1.REFCOUNTER
)
MERGE INTO TCATMSTR_TEMP mstr
USING
    (
        SELECT 
            CATSHOURS,
            COUNTER,
            (SELECT COUNTER FROM n WHERE REFCOUNTER = '') AS orig_counter,
            PERNR,
            REFCOUNTER,
            CATS_STATUS,
            WORKDATE,
            APDAT,
            LAETM,
            APPR_STATUS
        FROM 
            CATSDB
        WHERE
                (WORKDATE >= '1/1/2019' AND WORKDATE <= '1/11/2019' ) OR
                (APDAT >= '1/1/2019' AND APDAT <= '1/11/2019')
        ORDER BY 
                pernr, WORKDATE, ERSDA, ERSTM, APDAT, LAETM
    ) cats ON cats.orig_counter = mstr.counter
WHEN MATCHED THEN 
    UPDATE SET
        CATSHOURS = cats.CATSHOURS,
        PERNR = cats.PERNR,
        REFCOUNTER = cats.REFCOUNTER,
        CATS_STATUS = cats.CATS_STATUS,
        WORKDATE = cats.WORKDATE,
        APDAT = cats.APDAT,
        LAETM = cats.LAETM,
        APPR_STATUS = cats.APPR_STATUS
WHEN NOT MATCHED THEN
    INSERT
        (
            CATSHOURS,
            COUNTER,
            PERNR,
            REFCOUNTER,
            CATS_STATUS,
            WORKDATE,
            APDAT,
            LAETM,
            APPR_STATUS
        )
    VALUES
        (
            cats.CATSHOURS,
            cats.COUNTER,
            cats.PERNR,
            cats.PLANS,
            cats.REFCOUNTER,
            cats.CATS_STATUS,
            cats.WORKDATE,
            cats.APDAT,
            cats.LAETM,
            cats.APPR_STATUS
        );
...