【发布时间】: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