【问题标题】:Updating a column in one table through a column in another table通过另一个表中的列更新一个表中的列
【发布时间】:2012-09-04 16:03:57
【问题描述】:

我有 2 个表“A”和“B”。两者都有一个共同的列“名称”,并通过列“id”相互链接。表 A 中的“名称”列是空的,而表 B 中有数据。我的任务是将该列中的所有数据从表 B 填充到具有相应 ID 的表 A。

我正在使用以下查询:

UPDATE A
SET A.name = (SELECT B.name from B WHERE A.id = B.id)
WHERE EXISTS
(SELECT B.name from B)

只要我在 SQL 开发人员中运行查询,它就会冻结,我必须强制关闭它。谁能告诉我查询有什么问题?

【问题讨论】:

  • 我认为您的意图是通过 B 中的相应名称更新名称,但您的存在并不代表这种意图 - 如果 B 中至少有一行,则 A 中的每条记录都是如此。
  • 您需要将WHERE a.id = b.id 添加到WHERE EXISTS 子句中,因为它实际上是在检查'表b 中是否有行,而不是'表b 中是否有此ID 的行.并且不要选择一列,选择一个常数。如果两个 id 列在索引中,但 name 列不在(或在不同的索引中),这意味着查询只需要访问索引,而不是表。
  • 您需要将WHERE A.id = B.id 添加到exists() 以将更新候选者与实际数据相关联。
  • @Nikola,X-Zero:谢谢大家。我看到了我的查询中的缺陷。它很冻结,因为我有太多行并且没有索引。我刚刚做了索引,现在工作正常。

标签: sql oracle oracle10g sql-update tablecolumn


【解决方案1】:

试试这个:

UPDATE A
SET A.name = (SELECT B.name FROM B WHERE B.id = A.id AND B.name IS NOT NULL)
WHERE a.name IS NULL;

由于您使用的是 Oracle,因此这里是 IS NOT NULL 的参考。

这是 SQL Fiddle,您可以使用它:http://sqlfiddle.com/#!4/a5ad0/3

【讨论】:

  • 感谢您的回复。我尝试了查询,但它也不起作用。由于其他查询工作正常,这不会是服务器正确的问题吗?
  • 冻结了,因为我有太多行并且没有索引。我刚刚做了索引,现在工作正常。
【解决方案2】:

从上面的对话中我不确定您是否对数据进行了索引之外的任何更改,但您应该包含一个WHERE EXISTS 子句,如上所述。完整的查询应如下所示:

UPDATE A
   SET A.name = ( SELECT B.name FROM B WHERE B.id = A.id )
 WHERE EXISTS ( SELECT 1 FROM B WHERE B.id = A.id )

原始查询中的WHERE EXISTS 子句除了检查B 中是否至少有一个name 的非NULL 值外,不会做任何事情。

【讨论】:

    猜你喜欢
    • 2022-01-23
    • 2015-04-02
    • 1970-01-01
    • 2012-11-08
    • 1970-01-01
    • 2011-04-18
    • 1970-01-01
    • 1970-01-01
    • 2021-10-16
    相关资源
    最近更新 更多