【问题标题】:Why SELECT and UPDATE Return Different Record Counts/Affected为什么 SELECT 和 UPDATE 返回不同的记录计数/受影响
【发布时间】:2018-07-10 21:12:15
【问题描述】:

我编写了一个 SELECT 查询来了解有多少记录会受到我的 UPDATE 查询的影响。

SELECT 和 UPDATE 返回不同的记录数。

这是我的 SELECT 查询:

SELECT *
FROM T1
JOIN T2 on T1.ID = T2.ID
WHERE T1.Name IS NULL
  AND T2.Status = 'happy'

这是我的更新查询:

UPDATE T1
SET T1.Name = T2.Name
FROM T1
JOIN T2 on T1.ID = T2.ID
WHERE T1.Name IS NULL
  AND T2.Status = 'happy'

我的 SELECT 返回 19K 记录,而我的 UPDATE 影响 12K 记录。请注意,SELECT 和 UPDATE 的 WHERE 子句完全相同。

是什么导致 SELECT 和 UPDATE 查询之间的记录数不一致?

你能帮我理解这里发生了什么吗?

提前致谢!!

【问题讨论】:

  • UPDATE 永远不会多次更新一行。 SELECT 然而,很乐意多次返回相同的(目标)行。

标签: sql sql-update


【解决方案1】:

当您更新一侧时,这可能发生在一对多连接上。在您的情况下,您的某些T1 行似乎有不止一个T2 行,并且服务器将返回T1 行的次数与T2 表中的匹配次数一样多。

检查这是否与您的更新计数相符:

SELECT count(distinct T1.ID)
FROM T1
JOIN T2 on T1.ID = T2.ID
WHERE T1.Name IS NULL
  AND T2.Status = 'happy'

【讨论】:

    【解决方案2】:

    一个可能的原因:您有 ID 的实例,其中对应的 T1 记录存在多个 T2 记录

    【讨论】:

      【解决方案3】:

      尝试使用 distinct t1.name 代替 select *。由于您正在更新 T1 表中的名称,这可能会为您提供更新中影响的确切行数。

      希望有帮助,

      【讨论】:

        【解决方案4】:

        我遇到了类似的问题,在深入研究数据后,我发现 JOIN 条件中使用的 ID 在其中一个表中不是唯一的(有重复项)。看起来在执行 SELECT 时它需要所有匹配,但在执行 UPDATE 时它只从重复项中取出第一个。

        【讨论】:

          猜你喜欢
          • 2021-01-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-05-01
          • 1970-01-01
          • 1970-01-01
          • 2014-09-28
          • 2013-01-08
          相关资源
          最近更新 更多