1

我有一个场景,我正在以以下方式更新大约 40000 条工人记录:

  1. 我必须首先更新角色 ID 为 1 的工作人员。
  2. 然后剩下的角色 ID 为 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
4

1 回答 1

2

看起来您正在使用 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
于 2017-02-24T20:42:10.750 回答