У меня есть код, с которым я получаю помощь в другом вопросе, это как-то связано с этим, но только частично. Появилась мысль о замене курсора на что-то лучшее. Я подумал, что, возможно, 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
);