UPDATE语句的where子句中的子查询

时间:2012-10-01 06:53:25

标签: mysql sql

我有ATM卡数据库,其中有字段account_no,card_no,is_blocked,is_activated,issue_date 字段帐号和卡号不是唯一的,因为旧卡将过期并标记为is_block = Y,而另一个具有相同卡号的记录,帐号将插入到具有is_blocked = N的新行中。现在我需要在issue_date的帮助下更新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

2 个答案:

答案 0 :(得分: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' 

答案 1 :(得分:4)

这是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
                    )