使用if条件更新基于子查询的表

时间:2016-08-24 07:40:44

标签: mysql

我想实现这样的目标:

update bill b set b.isPaid = (if(select count(*) from bill_payment p where p.bill_id = b.id) > 0,true,false);

但是我收到了这个错误:

错误1064(42000):您的SQL语法有错误;检查与您的MySQL服务器版本相对应的手册,以便在res_bill_payment p(其中p.bill_id = b.id)的'select count(*)附近使用正确的语法> 0,真,假)'第1行

我怎么能在mySQL中做到这一点?

4 个答案:

答案 0 :(得分:2)

我建议使用EXISTS来写这个:

UPDATE bill b
    SET b.isPaid = (EXISTS (SELECT 1
                            FROM bill_payment p
                            WHERE p.bill_id = b.id
                           ) 
                   );

EXISTS子句返回一个布尔值,因此不需要显式使用TRUEFALSE(除非你真的真的想要)。

我强烈建议您使用EXISTS代替COUNT(*)来实现此目的,因为它通常具有更好的性能。 EXISTS可以在第一个匹配记录处停止,而不必计算所有匹配的记录。

答案 1 :(得分:1)

似乎你错过了一些括号:

UPDATE bill b 
SET b.isPaid = (IF(
                  (
                    SELECT COUNT(*) 
                    FROM bill_payment p 
                    WHERE p.bill_id = b.id
                  ) > 0
                  ,TRUE
                  ,FALSE
                ));

答案 2 :(得分:0)

For example, move data from 
B2 to C1, 
B4 to C3, 
B6 to C5, and so on

会做的伎俩

或者

UPDATE bill b
SET b.isPaid = true
    WHERE
          (SELECT count(*)
           FROM bill_payment p
           WHERE p.bill_id = b.id) > 0;

如果您想要更新每一行。

答案 3 :(得分:0)

您也可以使用UPDATE..JOIN..

执行此操作
UPDATE bill b
LEFT JOIN (SELECT bill_id FROM bill_payment GROUP BY bill_id) bp
 ON(bp.bill_id = b.id)
SET b.isPaid = if(bp.bill_id IS NULL , 1 , 0 )