根据匹配列从另一个表格列中更新列

问题描述:

以下查询正在更新所有(80k)记录,而不是匹配(5k)的记录。它有什么问题,如何纠正?的ALAM表= 80000个记录IDCP表= 5000个记录大约 记录计数根据匹配列从另一个表格列中更新列

update ALAM set ALAM.CDate = (select IDCP.CDate from IDCP 
           where ALAM.ASID = IDCP.ASID and ALAM.AID = IDCP.AID 
            and ALAM.MCode = '10001') 

记录总数约

的附加信息:

select ALAM.ASID, ALAM.AID, ALAM.CDate 
from ALAM, IDCP 
where ALAM.ASID = IDCP.ASID and ALAM.AID = IDCP.AID and ALAM.MCode = '10001' 

结果5000条记录大约

MERGE INTO ALAM 
    USING IDCP 
     ON ALAM.ASID = IDCP.ASID 
     AND ALAM.AID = IDCP.AID 
     AND ALAM.MCode = '10001' 
WHEN MATCHED THEN 
    UPDATE 
     SET CDate = IDCP.CDate; 
+0

这个伟大的工程呢!整洁的代码!谢谢! – psam

你不要指定SQL Server的版本。您可以在所有版本中使用专有的UPDATE...FROM语法。

UPDATE ALAM 
SET ALAM.CDate = IDCP.CDate 
FROM ALAM 
JOIN IDCP ON ALAM.ASID = IDCP.ASID and ALAM.AID = IDCP.AID 
WHERE ALAM.MCode = '10001' 

或SQL Server 2008

+0

它的SQL Server 2008中 – psam

在第一条语句更标准MERGE说法还没有说上主查询的WHERE子句。所以它在ALAM中的所有记录上执行(我假设它是80K)。

在第二个查询中,您加入了两个表,因此您只能从ALAM中与IDCP中的匹配。这是错误的。

UPDATE ALAM 
SET a.CDate = i.CDate 
FROM ALAM a INNER JOIN IDCP i ON a.ASID = i.ASID and a.AID = i.AID 
WHERE a.MCode = '10001' 

正如tjekkles说你离开的WHERE子句上的更新,你可以拉出内选择的:

update ALAM set ALAM.CDate = (select IDCP.CDate 
           from IDCP 
           where ALAM.ASID = IDCP.ASID 
           and ALAM.AID = IDCP.AID) 
where ALAM.MCode = '10001'