2014-07-04 42 views
0

我這裏提供MySQL查詢: -ERROR 1241(21000)和ERROR 1093(HY000)MYSQL子查詢的防止執行

mysql> UPDATE tbl_driver SET active_flag=NULL WHERE Pk_driver_id = (SELECT Pk_driver_id FROM tbl_driver JOIN tbl_location ON tbl_driver.pk_driver_id = tbl_location.fk_driver_id WHERE updated_at <= NOW() - INTERVAL 3 MINUTE AND active_flag=1); 



ERROR 1093 (HY000): You can't specify target table 'tbl_driver' for update in FROM clause 

,所以我改變了我的子查詢選擇*:

mysql> UPDATE tbl_driver SET active_flag=NULL WHERE Pk_driver_id = (SELECT * FROM tbl_driver JOIN tbl_location ON tbl_driver.pk_driver_id = tbl_location.fk_driver_id WHERE updated_at <= NOW() - INTERVAL 3 MINUTE AND active_flag=1); 



ERROR 1241 (21000): Operand should contain 1 column(s). 

請幫我解決這個問題,提前致謝。

+0

我改變「UPDATE tbl_driver SET active_flag = NULL WHERE Pk_driver_id =(SELECT Pk_driver_id FROM ......「仍然錯誤1093,沒有變化 – jasim

回答

0

使用一個INNER JOIN而不是再選擇應該讓你更新工作:

UPDATE 
    tbl_driver 
INNER JOIN 
    tbl_location 
ON 
    tbl_driver.pk_driver_id = tbl_location.fk_driver_id 
SET tbl_driver.active_flag = NULL 
WHERE 
    updated_at <= NOW() - INTERVAL 3 MINUTE 
AND 
    tbl_driver.active_flag = 1; 

MySQL有目前(5.6版本)的use of subqueries in UPDATE statements限制:

Currently, you cannot update a table and select from the same table in a subquery.

+0

是的,它工作。非常感謝你,你能告訴我爲什麼它沒有在子查詢上工作嗎? – jasim

+0

@ user3775378:這是因爲MySQL目前不允許這樣的子查詢:_目前,您無法更新表並從子查詢中的同一個表中選擇._我已將其編輯到我的答案中。 – VMai

0

您試圖將set與單行值相匹配,您希望將其與所有在子查詢中出現的值進行匹配,即使它始終爲單值。 IN是允許您匹配集合中的值的關鍵字。

UPDATE tbl_driver SET active_flag=NULL 
WHERE Pk_driver_id IN (
    SELECT Pk_driver_id FROM tbl_driver 
    JOIN tbl_location ON tbl_driver.pk_driver_id = tbl_location.fk_driver_id 
    WHERE updated_at <= NOW() - INTERVAL 3 MINUTE AND active_flag=1); 
+0

仍然返回相同的錯誤:錯誤1093(HY000):你不能sp在FROM子句中更新目標表'tbl_driver' – jasim

+0

我試過它也改變了子查詢,「SELECT * FROM tbl_driver ......」然後返回錯誤:錯誤1241(21000):操作數應該包含1列(s)不工作,請幫我解決這個問題 – jasim