mysql - 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
解决方案
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
推荐阅读
- python - 使用 Python 生成图像
- c# - Time.deltaTime 在 Unity 中执行的主要功能是什么?
- c# - SQLite 抛出繁忙异常并被锁定
- wordpress - 从免费 wordpress 帐户导入帖子后,Wordpress 帖子的代码语言块格式不起作用
- angular - 使用Angular 2+将单击的数据表行的值写入子组件html
- python-3.x - 如果数字不是整个python 3.5.7,如何打印
- python - 装饰器修改生成器值
- html - VideoJS - 多个视频
- javascript - GridLayout 中的列表的 Nativescript-vue 问题
- c++ - 移动数组元素 +1