首页 > 解决方案 > SQLServer 2008 中非相关表的条件更新

问题描述

我正在尝试更新historicTable(包含员工数据的 8k 条记录),当 2 个 ID 匹配(一个公司 ID 和另一个区域 ID)时tempTable,这是一个包含我要更新的数据的临时表(SUBG_ROT),否则(该列保留空),它应该从colxcoly一个历史表中复制数据。我正在考虑一个 JOIN/INNER JOIN 但我根本无法获得结构,所以我做了一个带有条件更新的存储过程,但我不知道如何调用临时表。感谢您对逻辑/代码的任何提示,我从 SQL Server 开始,所以我有点无能为力。

在我看来,代码应该这样做:

Update historicTable set SUBG when h.id1 = t.id1 and h.id2 = t.id2 then h.SUBG = t.SUBG else h.id1 = h.SUBG

这是代码

CREATE PROCEDURE updateHistoric
AS
UPDATE dbo.historicTable 
    SET SUBG_ROT = CASE
                    WHEN id1 = temptable.id1 AND id2 = temptable.id2 
                        THEN SUBG_ROT = temptable.SUBG_ROT
                        ELSE SUBG_ROT = AREA
                        END
GO

标签: sqlsql-servertsql

解决方案


您可以尝试使用OUTER APPLYlike follownig。

UPDATE t 
SET    t.subg_rot = CASE 
                    WHEN o.subg_rot IS NOT NULL THEN o.subg_rot 
                    WHEN t.subg_rot IS null then t.area 
                    ELSE t.subg_rot
                  END 
FROM   dbo.historictable t 
       OUTER APPLY (SELECT TOP 1 subg_rot 
                    FROM   temptable t2 
                    WHERE  t1.id1 = t2.id1 
                           AND t1.id2 = t2.id2)o 

注意:同样的事情也可以使用LEFT JOIN或子查询。


推荐阅读