首页 > 解决方案 > MySQL 更新列与连接表上的大小写不起作用

问题描述

起初,我创建了一个表“客户”。然后我用另一个属性“cust_level”更新了“客户”。我有另一张桌子“订单”。现在,我想根据“订单”表中订购的“数量”更新“客户”表上的 cust_level。但是,当我尝试更新“客户”表时,出现以下错误:

0 行受影响 匹配行:10 更改:0 警告:0

谢谢你的帮助!

create table customers(
    customer_id    varchar(20),
    PRIMARY KEY (customer_id)
);

ALTER TABLE customers ADD cust_level CHAR(1);

create table orders(
    order_id    int,
    order_no        varchar(10),
    quantity    int,
    order_date      date,
    delivery_date   date,
    customer_id    varchar(20),
    PRIMARY KEY(order_id),
    FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
);

update  customers C
left join
    (
        select customer_id,sum(quantity) as total_purchase from orders group by customer_id
    ) A on C.customer_id=A.customer_id
set C.cust_level =  case
        when A.total_purchase>2  then C.cust_level='3'
        when A.total_purchase>0 and A.total_purchase<3 then C.cust_level='2'
        else C.cust_level='1'
end

标签: mysqljoincase

解决方案


SET C.cust_level = CASE
    WHEN A.total_purchase>2 THEN C.cust_level='3'
    WHEN A.total_purchase>0 AND A.total_purchase<3 THEN >C.cust_level='2'
    ELSE C.cust_level='1'
END

这个 CASE 表达式有问题。您正在指定应该在 CASE 之前更新哪一列(SET C.cust_level = ...),但在 CASE 中引用它们(... THEN C.cust_level='3')。CASE 应该返回一个值,该值将分配给指定的列。

这应该写成:

SET C.cust_level = CASE
    WHEN A.total_purchase > 2 THEN '3'
    WHEN A.total_purchase > 0 AND A.total_purchase < 3 THEN '2'
    ELSE '1'
END

最后:一个接一个地评估 WHEN 条件,并且 CASE 在第一个匹配时停止。因此,虽然功能等效,但可以简化为:

SET C.cust_level = CASE
    WHEN A.total_purchase > 2 THEN '3'
    WHEN A.total_purchase > 0 THEN '2'
    ELSE '1'
END

推荐阅读