2013-02-07 49 views
0

我需要更新表中的一列。更新值應該從另一個表中檢索。我所做的查詢語句:從兩個不相關的表更新查詢

update db1.t1 set location=(select countryName from db1.t1, db2.t2 where t1.num 
between t2.beginNum AND t2.endNum limit 1) 

我收到以下錯誤:

Error Code: 1093 You can't specify target table t1 for update in FROM clause. 

然後,當我從FROM條款

update db1.t1 set location=(select countryName from db2.t2 where num 
between t2.beginNum AND t2.endNum limit 1) 

刪除的表名t1查詢工作但我不確定它是否正常工作。據我所知,如果我從多個表中檢索,我必須在FROM子句中指定兩個表。我工作的兩張桌子沒有任何共同的專欄。但是,t1中的值可以在t2中的兩個值之間找到。第二個查詢是否絕對正確?在where子句來自第一個表之後,查詢如何知道num?我擔心我得到錯誤的價值。

+0

如果你不能檢查數據是100%肯定,你可以嘗試去SQLFiddle.com並進行相同的測試,看看你的查詢工作或沒有 – jcho360

+0

你有行後,改變量你運行查詢?它看起來像你沒有爲你實際上是更新表的條件,所以這將試圖在位置設置每個記錄到同樣的事情,如果你的子查詢返回一個記錄(我想,如果不是這樣,什麼都不會發生),否則由於記錄集大小不匹配,它會崩潰。此外,如果你需要從2個表得到countryNames,你必須做一個'UNION ALL'在這種情況下,這樣所有的結果將在同一列。 –

回答

0

這兩個查詢做了一些不同的事情。

第一個嘗試將任意t2.CountryName分配給t1中的每個位置。它永遠不會分配一個NULL值,因爲可能有一些符合條件的t1.num。當t1.num不符合between的條件。在第一個查詢中對db1.t1的兩個引用是不同的引用,所以您在表之間有一個隱含的cross join

第二種方法是將任意t2.CountryName分配給行中的num值滿足條件的位置。對於其他行,NULL將被分配。

我的猜測是第二個查詢真的是你想要做的。