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

时间:2011-10-07 10:49:58

标签: sql sql-server join sql-update

以下查询正在更新所有(80k)记录而不是匹配的记录(5k)。它有什么问题以及如何纠正?

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

记录ALAM表的数量=约80,000条记录 记录IDCP表数=约5,000条记录

作为补充信息:

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条记录

4 个答案:

答案 0 :(得分:6)

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;

答案 1 :(得分:2)

您没有指定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中更标准的MERGE语句。

答案 2 :(得分:1)

在第一个语句中,您没有在主查询中声明WHERE子句。所以它在ALAM中的所有记录上执行(我假设它是80K)。

在第二个查询中,您加入了2个表,因此您只能从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'

答案 3 :(得分:0)

由于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'