2010-06-14 62 views
0

我试图用子查询更新一列MySQL表,并返回一个日期的子查询,以及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发动机的响应是 “子查询返回多个1行”。

回答

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栏的值相同。

+0

谢谢OMG小马。我了解我在查询中的错误,现在它正在按预期进行更新。 Regards, July – 2010-06-14 23:45:33

1

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

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

对它自己执行每个子查询并确定哪一个返回多行。如果他们不应该返回多于一行,那么您的数据可能是错误的。如果他们应该返回多行,则要么修改数据,以免它们(如我所预期的那样)或添加LIMIT子句。或者在查询之外添加一个聚合函数(如MAX),以正确地处理返回的多行。

+0

Charles,感谢您对子查询的全面解释。 干杯! – 2010-06-14 23:46:08