Объединение нескольких обновлений в SQL Server

У меня есть сценарий, в котором я обновляю около 40000 рабочих записей следующим образом:

  1. Я должен сначала обновить работников, которые имеют идентификатор роли 1.
  2. затем оставшиеся с идентификатором роли 2,0,3 только для тех, которые не были обновлены в предыдущем обновлении.

Мой вопрос: есть ли способ объединить все 4 в одном обновлении?

Меня беспокоит то, что мой рабочий сервер очень мощный с несколькими процессорами и может оказаться заблокированным, поскольку я обновляю одну и ту же таблицу снова и снова. У нас была эта проблема в других местах, где мы должны были заменить пользовательскую функцию.

Вот пример сценария обновления:

UPDATE A 
SET Start_Office = B.TX_LCTN,
    Start_Worker_ID = B.wrkr_id_prsn    
FROM #FinalRes A
INNER JOIN #StartData B ON A.ID_CASE = B.ID_CASE     
                        AND A.Case_Open_Date = B.Case_Open_Date
WHERE B.CD_ROLE = 1

UPDATE A 
SET Start_Office = B.TX_LCTN,
    Start_Worker_ID = B.wrkr_id_prsn
FROM #FinalRes A
INNER JOIN #StartData B ON A.ID_CASE = B.ID_CASE
                        AND A.Case_Open_Date = B.Case_Open_Date
WHERE A.Start_Worker_ID IS NULL
  AND B.CD_ROLE = 2

UPDATE A 
SET Start_Office = B.TX_LCTN,
    Start_Worker_ID = B.wrkr_id_prsn
FROM #FinalRes A
INNER JOIN #StartData B ON A.ID_CASE = B.ID_CASE
                        AND A.Case_Open_Date = B.Case_Open_Date
WHERE A.Start_Worker_ID IS NULL
  AND B.CD_ROLE = 0

UPDATE A 
SET Start_Office = B.TX_LCTN,
    Start_Worker_ID = B.wrkr_id_prsn
FROM #FinalRes A
INNER JOIN #StartData B ON A.ID_CASE = B.ID_CASE
                        AND A.Case_Open_Date = B.Case_Open_Date
WHERE A.Start_Worker_ID IS NULL
  AND B.CD_ROLE = 3

1 ответ

Решение

Похоже, вы используете SQL Server. Если так, apply может помочь:

UPDATE fr
    SET Start_Office = sd.TX_LCTN,
        Start_Worker_ID = sd.wrkr_id_prsn    
    FROM #FinalRes fr APPLY
         (SELECT TOP 1 sd.*
          FROM #StartData sd
          WHERE sd.ID_CASE = fr.ID_CASE AND
                sd.Case_Open_Date = fr.Case_Open_Date
          ORDER BY sd.CD_ROLE 
         ) sd
Другие вопросы по тегам