2016-10-20 202 views
0

我必須更新MySQL數據庫中的表中的多個行,其中查找要更新的行的條件位於同一個表中。如何在FROM子句中的MySQL中的UPDATE查詢中使用子查詢

例如,我有一個名爲「cdrs」的表。表中有一列叫做「tf」,這是我必須更新的那一列。 具有更新或不更新行的條件是「calltype」。 「recordId」是該表的關鍵。 我使用的查詢,這是一個:

UPDATE cdrs 
SET tf = 1 
WHERE recordId in (SELECT recordId from cdrs WHERE calltype = 11); 

但與此查詢,我得到以下錯誤:

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

我搜索這裏,說實話,發現很多帖子在這個問題上但是當所有表都在SET子句中時,它們都處理這個問題,而不是WHERE。 例如,我發現這個職位: MySQL Error 1093 - Can't specify target table for update in FROM clause

我試圖用這個想法,但沒有成功。

有沒有人有同樣的問題,並找到了解決辦法? 我很感謝解決這個問題的任何幫助。

非常感謝你, 若昂·保羅

+1

是不是很簡單了很多做'UPDATE的CDR SET TF = 1,其中CALLTYPE = 11'? – apokryfos

+0

嗨@apokryfos, 是的,這是真的!我堅持這個想法,即必須使用主鍵進行更新,但使用calltype,從邏輯上講是合理的。 非常感謝! –

回答

0

通用問題的答案是,你不能用同一個表中的子查詢比你

UPDATE cdrs 
SET tf = 1 
WHERE recordId in (SELECT recordId from (SELECT * FROM cdrs) innerCdrs WHERE calltype = 11); 

這工作,因爲不是使用表cdrs你:做主更新查詢,您可以通過做一招解決這個問題根據查詢SELECT * FROM cdrs創建臨時表。

然而,在你的情況下,你的查詢可以大大簡化到

UPDATE cdrs SET tf=1 WHERE calltype=11 
+0

謝謝。 我喜歡這個答案,因爲它也增加了關於臨時表的信息,當發生同樣類型的問題時可能會有用。 –

3

你可以做簡單的要求:

UPDATE cdrs SET tf = 1 WHERE calltype = 11; 
+0

非常感謝。 這真的很有道理,正如其他答案也指出的那樣。 我只想使用主鍵在表中進行更新。 非常感謝。 –

0

這很簡單,只要UPDATE cdrs SET tf = 1 WHERE calltype = 11;

+0

非常感謝您的回答。 現在,有一些答案指出了同樣的事情,我想爲什麼我只考慮主鍵作爲更新的參考。 此致敬禮。 –

相關問題