T-SQL UPDATE statement affects less records than select statement
我试图用另一个表的日期列更新一个表的
在更新它之前,我正在使记录受到影响,以便先前查看UPDATE中将影响哪些记录。所以我用下面的WHERE子句执行SELECT语句:
注意:
-
DateTimeField 的类型为DateTime -
DateField 的类型为Date
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | SELECT tblToUpdate.* FROM MyTable1 tblToUpdate INNER JOIN MyTable2 fromTbl ON tblToUpdate.Id = fromTbl.Id WHERE ISNULL(fromTbl.DateField, GETDATE()) >= DATEFROMPARTS(1753, 1, 1) AND ((fromTbl.DateField IS NOT NULL AND tblToUpdate.DateTimeField IS NULL) OR (fromTbl.DateField IS NULL AND tblToUpdate.DateTimeField IS NOT NULL) OR fromTbl.DateField <> CAST(tblToUpdate.DateTimeField AS DATE)) UPDATE tblToUpdate SET tblToUpdate.DateTimeField = fromTbl.DateField FROM MyTable1 tblToUpdate INNER JOIN MyTable2 fromTbl ON tblToUpdate.Id = fromTbl.Id WHERE ISNULL(fromTbl.DateField, GETDATE()) >= DATEFROMPARTS(1753, 1, 1) AND ( (fromTbl.DateField IS NOT NULL AND tblToUpdate.DateTimeField IS NULL) OR (fromTbl.DateField IS NULL AND tblToUpdate.DateTimeField IS NOT NULL) OR fromTbl.DateField <> CAST(tblToUpdate.DateTimeField AS DATE) ) |
请注意,在更新它之前,我检查了
问题是
如果两个语句中的from和where子句相同,为什么会发生这种情况?
我认为分别由
这很容易证明。当有多个行满足联接谓词时,您将从选择和更新中获得不同的行数。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | CREATE TABLE Header(HeadID INT IDENTITY, Name VARCHAR(50)) INSERT Header SELECT 'test' CREATE TABLE Details(DetailsID INT IDENTITY, HeadID INT, Name VARCHAR(50)) INSERT Details VALUES(1, 'asdf'),(1,'qwer') SELECT * --this returns 2 rows FROM Header h JOIN Details d ON d.HeadID = h.HeadID UPDATE h --only 1 row affected SET Name = 'what?' FROM Header h JOIN Details d ON d.HeadID = h.HeadID |