以下查询正在更新所有(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条记录
答案 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'