簡體   English   中英

UPDATE語句的where子句中的子查詢

[英]subquery in where clause of UPDATE statement

我有ATM卡的數據庫,其中有字段account_no,card_no,is_blocked,is_activated,issue_date字段帳號和卡號不唯一,因為舊卡將過期並標記為is_block = Y和另一個具有相同卡號的記錄,帳號將插入到is_blocked = N的新行中。 現在我需要在issue_date ie的幫助下更新is_blocked / is_activated

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')

但是不允許我這樣做它會引發跟隨錯誤

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

試試這個:

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' 

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

(至少對我而言)令人驚訝的部分是它看起來確實是解析器問題,而不是引擎本身的問題,因為如果將子選擇包裝到派生表中,這確實有效:

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
                    )

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM