MySQL更新有两个子查询

时间:2010-06-14 23:26:23

标签: mysql sql-update mysql-error-1242

我正在尝试使用返回日期的子查询和WHERE子句的另一个子查询来更新MySQL表的一列。

就是这样:

UPDATE wtk_recur_subs_temp 
   SET wtk_recur_date = (SELECT final_bb.date
                           FROM final_bb, wtk_recur_subs 
                          WHERE final_bb.msisdn = wtk_recur_subs.wtk_recur_msisdn) 
WHERE wtk_recur_subs_temp.wtk_recur_msisdn IN (select final_bb.msisdn 
                                                 from final_bb)

MySQL引擎的响应是“Subquery返回超过1行”。

2 个答案:

答案 0 :(得分:1)

使用:

UPDATE wtk_recur_subs_temp,
       final_bb, 
       wtk_recur_subs 
   SET wtk_recur_subs_temp.wtk_recur_date = final_bb.date
 WHERE final_bb.msisdn = wtk_recur_subs.wtk_recur_msisdn
   AND wtk_recur_subs_temp.wtk_recur_msisdn = final_bb.msisdn

错误是因为:

SET wtk_recur_date = (SELECT final_bb.date
                        FROM final_bb, wtk_recur_subs 
                       WHERE final_bb.msisdn = wtk_recur_subs.wtk_recur_msisdn) 

... final_bb.date值是final_bbwtk_recur_subs msisdn列值匹配的所有日期值。

答案 1 :(得分:1)

这可能会让你感到震惊,但是你的一个子查询返回了多行!

在您设置的情况下不允许这样做。这两个子查询中的每一个都必须返回一行而且只返回一行。或者没有行。

自己执行每个子查询,并确定哪个子查询返回多行。如果他们不应该返回多行,那么您的数据可能是错误的。如果它们应该返回多行,那么您要么修改数据,要么不修改(如我所假设的那样),或者添加LIMIT子句。或者在查询外添加一个聚合函数(如MAX),以便对返回的多行执行适当的操作。