2012-10-31 24 views
0

中選擇的表爲什麼我在嘗試更新a_fees表時遇到以下錯誤?從我可以收集的內容來看,您不能將子選擇標準基於正在更新的表格嗎?是否因爲SQL被反向讀取?我怎樣才能解決這個問題?更新我從

錯誤消息:1093 - 您不能指定目標表 'a_fees' FOR UPDATE FROM子句

UPDATE a_fees 
SET active = 'N' 
WHERE a_fees.fee_id IN 
(
SELECT fee_id 
FROM a_fees 
WHERE verified = 'N' 
HAVING audit_fees + audit_related_fees + tax_fees + other_fees < 5000); 

回答

0

HAVING子句中結合使用GROUP BY子句,你必須使用像SUM聚合函數的HAVING子句,像這樣:

SELECT fee_id 
FROM a_fees 
WHERE verified = 'N' 
GROUP BY fee_id 
HAVING SUM(audit_fees + audit_related_fees + tax_fees + other_fees) < 5000; 

這個sums autid_feesaudit_related_feestax_feesother_fees的每一行都具有然後檢查它是否爲< 5000.

但是,如果fee_id是唯一的,這意味着您必須總結的所有字段位於同一行,因此不需要使用GROUP BY子句和查詢可以簡化爲這樣:

SELECT fee_id 
FROM a_fees 
WHERE 
    verified = 'N' 
    AND (audit_fees + audit_related_fees + tax_fees + other_fees) < 5000; 

你UPDATE查詢就變成了:

UPDATE a_fees 
SET active = 'N' 
WHERE a_fees.fee_id IN (
    SELECT fee_id 
    FROM a_fees 
    WHERE verified = 'N' 
    AND audit_fees + audit_related_fees + tax_fees + other_fees < 5000); 

您說對了:MySQL不允許你更新你使用在選擇相同的表部分,你應該使用JOINS重寫更新查詢。

但如果fee_id是唯一沒有必要使用子查詢和它的更好的使用只是一個更新,無需子查詢:

UPDATE a_fees 
SET active = 'N' 
WHERE verified = 'N' 
    AND audit_fees + audit_related_fees + tax_fees + other_fees < 5000; 
+0

謝謝:)不過我也在想,如果a_fees.fee_id是獨一無二的,不需要使用子查詢,並且UPDATE查詢可以簡化,就像我上一段代碼片段 – fthiella

+0

謝謝!你搖滾。我認爲括號可能有點不一致,但這一切都很有意義。謝謝!多好的使用stackoverflow的經驗! – Ben

+0

我剛剛執行了這個聲明。像魅力一樣工作。 :) – Ben