【问题标题】:Update Orphan Records using Join使用 Join 更新孤立记录
【发布时间】:2016-05-16 01:46:18
【问题描述】:

我有 2 张桌子,如下所示。理想情况下,Table2.C1Table1.C1 的外键,但最初并未设置该外键。我们现在无法设置外键,因为 Table2 中存在一些孤立记录。我们想将那些孤立记录列更新为 NULL。

注意:我不想使用任何子/嵌套查询

Table1
--------
| C1   |
--------
| 1    |
| 2    |
| 3    |
| 4    |
|------|

Table2
---------------
| C1   |  C3  |
---------------
| 1    |  A   |
| 1    |  B   |
| 8    |  C   |
| 9    |  D   |
| 2    |  E   |
|------|------|

我想将 89 的记录更新为 NULL。

【问题讨论】:

  • 你问了另一个关于删除孤立行的问题。您是否认为更新真的如此不同以至于您无法使用类似的解决方案?
  • @Barmer 请不要以为我想在这里滥用...我花了将近 3 到 4 个小时才最终决定发布问题。
  • 您在第一个问题后 35 分钟发布了第二个问题。那不是几个小时。
  • @Barmar 对不起,我的意思是我花了两个查询和足够的答案。如果您看到不同之处,我们深表歉意。
  • 我的抱怨是您得到了问题的答案,并且显然没有为您的第二个问题尝试相同的解决方案,即使它几乎相同。得到答案后 30 分钟,您发布了第二个问题。

标签: mysql join sql-update


【解决方案1】:

您可以使用如下查询:

UPDATE Table2 SET C1 = NULL WHERE C1 NOT IN ( SELECT Table1.C1 FROM Table1 )

注意:SQL 优化器应该通过使用 JOIN 操作符来优化这个查询。因此,对于这样简单的查询,您使用嵌套子查询或通过这样的连接并不重要:

UPDATE Table2 SET C1 = NULL FROM Table2 
LEFT JOIN Table1 ON Table2.C1 = Table1.C1 
WHERE Table1.C1 IS NULL

两个大表查询的执行计划应该是一样的

【讨论】:

    【解决方案2】:

    如果没有子查询,我不知道您想如何执行此操作,因为您无法对 table1 中不存在...

    的行执行 JOIN

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-04
      • 2012-09-19
      • 1970-01-01
      相关资源
      最近更新 更多