2012-09-04 39 views
3

我有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开发人员的查询,它只是冻结和我必须强制关闭它。任何人都可以告诉我查询有什么问题吗?

+0

我认为你的意图是从B中的对应名称更新的名字,但你的存在并不代表这个意图 - 它是用于在每个记录真实的,如果有在B. –

+1

至少一行您需要添加WHERE EXISTS“子句中的WHERE a.id = b.id',因为它确实检查'b'表中是否有行,而''表中是否存在该行的id'。并且不要选择一列,选择一个常数。如果两个id列位于索引中,但“name”列不是(或位于不同的索引中),则意味着查询只需访问索引,而不是表格。 –

+1

您需要将WHERE A.id = B.id'添加到exists()以将更新候选与实际数据相关联。 –

回答

5

试试这个来代替:

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小提琴,这样就可以用它玩:http://sqlfiddle.com/#!4/a5ad0/3

+0

感谢您的回复。我试过这个查询,但它也不起作用。它不能成为服务器的问题,因为其他查询工作正常吗? –

+0

它被冻结,因为我有太多的行而不指数。我只是做了索引,现在工作正常。 –

1

我不是你是否做超出索引数据的任何改变上述谈话肯定,但你应该包括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条款不会做很多的事情,除了检查,看是否有至少一个在Bname非NULL值。

相关问题