关于sql server:T-SQL UPDATE语句影响的记录少于select语句

T-SQL UPDATE statement affects less records than select statement

我试图用另一个表的日期列更新一个表的DateTime列。

在更新它之前,我正在使记录受到影响,以便先前查看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)
        )

请注意,在更新它之前,我检查了Where子句中的DateField是否在DateTime范围内。

问题是SELECT语句返回的记录数与UPDATE语句返回的受影响的记录数不同。

UPDATE语句影响的记录少于SELECT语句返回的记录。

如果两个语句中的from和where子句相同,为什么会发生这种情况?

我认为分别由SELECT返回和受UPDATE语句影响的记录数应该相同。


这很容易证明。当有多个行满足联接谓词时,您将从选择和更新中获得不同的行数。

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