Объединение нескольких обновлений в SQL Server
У меня есть сценарий, в котором я обновляю около 40000 рабочих записей следующим образом:
- Я должен сначала обновить работников, которые имеют идентификатор роли 1.
- затем оставшиеся с идентификатором роли 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