У меня есть
tableD (ID int, matchID char, PID char, set int, num char, status char, msg char)
ID matchID PID set num status msg
1 00A123 xx123 1 11
2 00B247 xx213 1 13
3 00H417 xx317 2 15
4 00G547 xx328 3 16
5 00Y547 xx721 3 19
TableP
PID num
xx213 13
...................
Теперь мы должны установить status = void
, где в том же наборе,
Для того же PID
в tabled
иtableP
существует другой номер или запись не существует в tableP
.Это применимо, если хотя бы один соответствующий [num]
существует в tableP
.Держите тот, который соответствует и аннулируйте все другие.Также в [msg]
должно быть указано, где __ - [ID] совпавшего.
Если ни один из них не подходит для того же набора, пропустите один с самым низким [matchID]
и аннулируйте все остальные с тем же сообщением.Также [matchID]
всегда 00*xxxxxxx (10 digit)
, где * is alphabet
и x is (0-9)
.
Ожидаемый результат:
ID matchID PID set num status msg
1 00A123 xx123 1 11 VOID <duplicate of ID = 2>
2 00B247 xx213 1 13 NULL NULL
3 00H417 xx317 2 15 NULL NULL
4 00G547 xx328 3 16 NULL NULL (G<Y)
5 00Y547 xx721 3 19 VOID <duplicate of ID = 4>
Я пробовал:
;WITH setInfo AS (
SELECT [SET],
CASE WHEN EXISTS (SELECT 1 FROM tableD b
WHERE b.[set]=a.[set] AND num IS NOT NULL)
THEN 1 ELSE 0 END AS HasNum,
MIN(matchID) AS MinMatchPID
FROM tableD a
GROUP BY [SET]
)
UPDATE a SET
PID = CASE WHEN s.HasNum = 0 AND a.PID = s.MinMatchPID THEN a.ID
WHEN s.HasNum = 1 AND a.PID = (SELECT min(MatchID) FROM tableD b
WHERE b.[set] = a.[set]
AND b.num is not null) THEN a.PID
END
FROM TableD a
JOIN setInfo s ON s.[set] = a.[set]
;WITH CTE_Duplicates1 AS
(SELECT MIN(ID) OVER (PARTITION BY [set]) Mn1,
ROW_NUMBER() OVER (PARTITION BY [set]
ORDER BY ID) RN,*
FROM tableD )
UPDATE CTE_Duplicates1
SET status = 'VOID',
Message = '<V-Duplicate of ID=' + CAST(Mn1 as VARCHAR(15))+'>'
WHERE RN>1
Не дает точных результатов.