我试图从另一个表中用日期列更新一个表的DateTime列。
在更新之前,我将得到受影响的记录,以便查看更新中将影响哪些记录。因此,我使用WHERE子句执行SELECT语句:
备注:
DateTimeField是DateTimeDateField类型的是Date型的
代码:
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)
)请注意,在更新DateField之前,我在Where子句中选中DateTime范围。
问题是,SELECT语句返回的记录数与受UPDATE语句影响的记录数不相同。
UPDATE语句影响的记录少于SELECT语句返回的记录。
如果from和where子句在两个语句中相同,为什么会发生这种情况?
我认为SELECT返回的记录和UPDATE语句分别影响的记录数量应该是相同的。
发布于 2019-11-27 16:57:29
这很容易证明。当有多行满足连接谓词时,您将从select和update中获得不同的行计数。
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.HeadIDhttps://stackoverflow.com/questions/59074911
复制相似问题