【问题标题】:Why does updating only some rows delete the rest of the rows in the column?为什么只更新某些行会删除列中的其余行?
【发布时间】:2014-04-21 10:42:21
【问题描述】:

我有一个 100 行的表,索引为 1-100。我有另一个 50 行的表,索引为 1-50。我想取 50 行表中的行,并更新 100 行表中相应索引处的值:

UPDATE t100 SET text = (SELECT text FROM t50 WHERE t50.id = t100.id)

它可以工作,但它会将 100 行表中的第 51-100 行变为NULL。我只是想把这些数据保存在那里。我究竟做错了什么?

【问题讨论】:

  • 您没有 WHERE 条件,因此它将更新所有行。由于您没有要放入所有行的数据,其余的将设置为 NULL。
  • 如果您需要帮助找到更通用的解决方案,您可能需要添加您正在使用的 RDBMS (oracle/mysql/sql server/...)。

标签: sql merge sql-update


【解决方案1】:

因为您更新了 t100 中的每一行。

将以下内容添加到查询的末尾

Where t100.id <=50

【讨论】:

  • 这在当前场景中可能有效,但不能很好地概括,而使用WHERE t100.id IN (SELECT id FROM t50) 则不管 t100 中的哪一组行与 t50 中的行匹配。
  • 取决于你真正想做什么
【解决方案2】:

无论t50 中是否有相应的条目,您都将更新t100 的所有条目。你应该做的是:

UPDATE t100 SET text = (SELECT text FROM t50 WHERE t50.id = t100.id)
WHERE t100.id IN (SELECT id FROM t50)

【讨论】:

    【解决方案3】:

    像这样连接两个表:

    UPDATE t1
    SET t1.text = t2.text
    FROM t100 AS t1
    INNER JOIN t50 AS t2 ON t2.id = t1.id
    

    【讨论】:

      猜你喜欢
      • 2019-04-28
      • 2018-05-10
      • 2018-07-02
      • 1970-01-01
      • 1970-01-01
      • 2020-10-14
      • 1970-01-01
      • 2020-12-01
      • 1970-01-01
      相关资源
      最近更新 更多