SQL Server: два сценария в таблице - PullRequest
0 голосов
/ 11 ноября 2011

У меня есть

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, где в том же наборе,

  1. Для того же PID в tabled иtableP существует другой номер или запись не существует в tableP.Это применимо, если хотя бы один соответствующий [num] существует в tableP.Держите тот, который соответствует и аннулируйте все другие.Также в [msg] должно быть указано, где __ - [ID] совпавшего.

  2. Если ни один из них не подходит для того же набора, пропустите один с самым низким [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 

Не дает точных результатов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...