2013-03-23 32 views
0

我有一個更新查詢,我需要在MySQL中運行,並且遇到了一些麻煩。我花了最後一個小時研究一個解決方案,但找不到真正有用的解決方案。我需要執行以下操作:使用MySQL中的子查詢進行更新

UPDATE TABLE1 SET ID = (SELECT TABLE2.ID FROM TABLE2, TABLE1 
WHERE TABLE1.NAME=TABLE2.NAME) WHERE TABLE1.ID IS NULL 

我一直在收到Error Code: 1242. Subquery returns more than 1 row錯誤。我如何修改我的查詢以使其成功運行?

基本上,我需要根據條件從另一個表中填寫一列所有值的空白。請在這個問題上指導我。謝謝!

回答

1
UPDATE TABLE1, TABLE2 
    SET TABLE1.ID = TABLE2.ID 
    WHERE TABLE1.ID IS NULL 
    AND TABLE1.NAME = TABLE2.NAME 

可能應該做你想要什麼,假設NAME是唯一一個所有名稱的ccross TABLE1和TABLE2。

+0

我試過這個,但它給了我一個'IN/ALL/ANY子查詢'錯誤中的未知列ID。爲什麼會發生? – CodingInCircles 2013-03-24 02:02:41

+0

第一個ID在這裏不明確。 'SET ID'需要是'SET TABLE1.ID'。這可能會修復錯誤。爲什麼你會遇到未知的列錯誤,而不是一個不明確的列名錯誤,我不知道。 – starshine531 2013-03-24 12:03:08

+0

@ starshine531感謝您的幫助,它的確被打破了。我回到了我的初步答案,並發現打破它的錯字。請參閱http://sqlfiddle.com/#!8/ed7df – didierc 2013-03-24 12:26:27

0

SELECT TABLE2.ID從表2可以TABLE1 WHERE TABLE1.NAME = TABLE2.NAME

該查詢返回不止一行

Your Query:UPDATE TABLE1 SET ID = (// here setting one value 



TABLE1.NAME=TABLE2.NAME // more than one matched records are available 

這裏要設置ID,但子查詢返回的時候多行不能設置一個值

+1

這是假設是一個答案還是一個問題? – Cyclonecode 2013-03-23 01:06:18

+0

@Krister Andersson我解釋下面的原因。這是一個沒有問題的答案 – 2013-03-23 01:08:05

+0

@CodingInCircles你檢查我的答案 – 2013-03-23 01:13:10

2

好吧,這聽起來像你的名字字段不是唯一的。你的子查詢匹配多行,所以你要麼需要找到一個唯一的ID匹配除了姓名,否則,如果你想只取子查詢的第一個結果做到這一點:

UPDATE TABLE1 SET ID = (SELECT TABLE2.ID FROM TABLE2, TABLE1 WHERE TABLE1.NAME=TABLE2.NAME LIMIT 1) WHERE TABLE1.ID IS NULL

+0

另外,您應該知道子查詢效率低下。大多數子查詢可以用左連接或其他類型的連接替換。儘可能避免子查詢。 – starshine531 2013-03-23 04:56:27

+0

我試過這個,它運行沒有任何錯誤,除了它不會改變任何東西。大約需要2-3分鐘才能在table1中運行約1100行,在table2中運行約150k行,並返回受影響和匹配的行數以及警告的數量(0),但是當我查看table1時,沒有任何更改。爲什麼會這樣呢? – CodingInCircles 2013-03-24 02:07:12

+0

嘗試運行子查詢SELECT TABLE2.ID FROM TABLE2,TABLE1 WHERE TABLE1.NAME = TABLE2.NAME LIMIT 1'。也許你得到的結果與你期望的不同。也可以運行沒有LIMIT 1的查詢來查看您得到的結果。這可能會給你一些線索,看看發生了什麼。 正如我所提到的,子查詢效率低下,因此很慢。你確實爲這些表設置了主鍵,是的? – starshine531 2013-03-24 03:05:33