【发布时间】:2019-11-27 16:47:03
【问题描述】:
我正在尝试用另一个表中的日期列更新一个表的 DateTime 列。
在更新它之前,我让记录受到影响,以便以前查看哪些记录会在 UPDATE 中受到影响。所以我使用以下 WHERE 子句执行 SELECT 语句:
注意:
-
DateTimeField是DateTime类型 -
DateField是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)
)
请注意,我在更新之前检查了Where 子句中的DateField 是否在DateTime 范围内。
问题是SELECT语句返回的记录数与UPDATE语句返回的受影响记录数不一样。
UPDATE 语句影响的记录少于SELECT 语句返回的记录。
如果两个语句中的 from 和 where 子句相同,为什么会发生这种情况?
我认为SELECT返回的记录数和UPDATE语句分别影响的记录数应该是一样的。
【问题讨论】:
-
你的表有触发器吗?
-
我的猜测是您在 MyTable2 中有多行,而在 MyTable1 中至少有一行。对于使用这样的连接找到的每一行,它只会更新一次表。
-
@Pரதீப் 不,表没有触发器。
-
@SeanLange 是的,我已经深入检查过,你是对的。这种关系是一对多的。
标签: sql sql-server sql-update