【问题标题】:T-SQL UPDATE statement affects less records than select statementT-SQL UPDATE 语句影响的记录少于 select 语句
【发布时间】:2019-11-27 16:47:03
【问题描述】:

我正在尝试用另一个表中的日期列更新一个表的 DateTime 列。

在更新它之前,我让记录受到影响,以便以前查看哪些记录会在 UPDATE 中受到影响。所以我使用以下 WHERE 子句执行 SELECT 语句:

注意

  • DateTimeFieldDateTime 类型
  • DateFieldDate 类型

代码:

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


【解决方案1】:

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

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

【讨论】:

  • 是的,这就是正在发生的事情。 SeanLange 也建议。感谢您提供了一个很好的例子!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-08
  • 2021-09-05
  • 2018-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-06
相关资源
最近更新 更多