根据匹配列从另一个表格列中更新列
问题描述:
以下查询正在更新所有(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;
答
你不要指定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'
这个伟大的工程呢!整洁的代码!谢谢! – psam