2012-09-04 105 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值。

相關問題