Как я могу оптимизировать этот SQL код дальше, чтобы работать быстрее - PullRequest
0 голосов
/ 22 января 2020
UPDATE N SET [actType] = 'X'
FROM tableA N
WHERE NOT EXISTS (SELECT 1  
                  FROM tableA O 
                  WHERE O.clientCode = N.clientCode AND 
                        O.[userName] = N.[userName] AND 
                        O.[profile] = N.[profile] AND 
                        O.[rankID] = N.[rankID] - 1 
                 ) AND 
      N.[rankID] NOT IN (SELECT MIN(T.[rankID]) 
                         FROM tableA T 
                         WHERE T.[userName] = N.[userName]
                        )

1 Ответ

0 голосов
/ 22 января 2020

Вы можете использовать row_number() с возможностью обновления cte :

with cte as (
     select N.*, ROW_NUMBER() OVER (PARTITION BY [userName] ORDER BY rankID) AS Seq
     from tableA N
)
update c
     set c.[actType] = 'X'
from cte c
where seq > 1 and
      not exists (SELECT 1  
                  FROM tableA O 
                  WHERE O.clientCode = c.clientCode AND 
                        O.[userName] = c.[userName] AND 
                        O.[profile] = c.[profile] AND 
                        O.[rankID] = c.[rankID] - 1 
                );

Ваш синтаксис предлагает SQL Server. Итак, вы можете использовать.

...