2012-10-01 65 views
4

我有ATM卡的數據庫中有字段account_no,card_no,is_blocked,is_activated,issue_date 字段帳號和卡號不唯一,因爲舊卡將過期並標記爲is_block = Y和另一個具有相同卡號的記錄,帳號將被插入到具有is_blocked = N的新行中。現在我需要更新is_blocked /與ISSUE_DATE即UPDATE語句where子句中的子查詢

UPDATE card_info set is_blocked='Y' where card_no='6396163270002509' 
AND opening_date=(SELECT MAX(opening_date) FROM card_info WHERE card_no='6396163270002509') 

幫助is_activated但不允許我這樣做 它拋出以下錯誤

1093 - You can't specify target table 'card_info' for update in FROM clause 

回答

5

試試這個:

UPDATE card_info ci 
INNER JOIN 
(
    SELECT card_no, MAX(opening_date) MaxOpeningDate 
    FROM card_info 
    GROUP BY card_no 
) cm ON ci.card_no = cm.card_no AND ci.opening_date = cm.MaxOpeningDate 
SET ci.is_blocked='Y' 
WHERE ci.card_no = '6396163270002509' 
+0

MySQL有這麼多愚蠢的限制,這是其中之一。你的解決方案有效 – stamster

4

這是MySQL解析器的那些愚蠢的限制之一。解決此問題的常用方法是使用JOOM查詢,如Mahmoud所示。

的(至少我)令人驚訝的是,它似乎真的引擎本身的解析器問題,而不是一個問題,因爲如果你換子選擇到派生表,這樣做的工作:

UPDATE card_info 
    SET is_blocked='Y' 
WHERE card_no = '6396163270002509' 
AND opening_date = (select max_date 
         from (
          SELECT MAX(opening_date) as_max_date 
          FROM card_info 
          WHERE card_no='6396163270002509') t 
        )