使用SELECT语句声明变量优化SQL查询,订单状态区分逻辑报错求助
修正你的SQL查询:解决变量与语法问题
我来帮你搞定这个SQL的问题,先梳理下你代码里的几个关键错误,再给出优化后的方案:
代码里的核心问题
- 变量赋值的逻辑错误:你在声明
@driver_collected时,子查询里引用了主查询的e.entry_id——但变量是在主查询之前定义的,这时候数据库还没解析到主表e,根本不知道e.entry_id是什么,而且赋值语句末尾多了个多余的逗号。 - CASE语句语法缺失:你的条件判断里少了逻辑运算符
AND,比如when e.delivery_method_id <> 3 @driver_collected is null这种写法不符合SQL语法,两个条件之间必须用AND连接。 - 变量的误用场景:这个场景下用全局变量不合适,因为每个
entry对应的driver_collected值是和当前行关联的,全局变量只能存一个值,没法对应每一行的不同结果。
优化后的两种解决方案
方案1:关联子查询(快速修改)
直接把原本的变量逻辑放到CASE语句里,作为关联子查询,让每一行都计算对应entry的max(recieved)值:
select e.entry_id, e.taxpoint_date, case when e.delivery_method_id <> 3 AND ( select max(x.recieved) from entry_extra x inner join entry e2 on e2.entry_id = x.entry_id where e2.link_entry_id = e.entry_id ) is null then 'Ready for Dispatch' when e.delivery_method_id <> 3 AND ( select max(x.recieved) from entry_extra x inner join entry e2 on e2.entry_id = x.entry_id where e2.link_entry_id = e.entry_id ) is not null then 'Out For Delivery' else 'Test' end as delivery_status from entry e where e.entry_type in ('SORD','SRTN') and e.trader_id = 1203046
方案2:CTE+JOIN(更高效,适合大数据量)
先通过CTE预计算所有link_entry_id对应的最大recieved值,再关联主表,避免重复计算子查询,提升执行速度:
with entry_collected as ( select e2.link_entry_id, max(x.recieved) as driver_collected from entry_extra x inner join entry e2 on e2.entry_id = x.entry_id group by e2.link_entry_id ) select e.entry_id, e.taxpoint_date, case when e.delivery_method_id <> 3 AND ec.driver_collected is null then 'Ready for Dispatch' when e.delivery_method_id <> 3 AND ec.driver_collected is not null then 'Out For Delivery' else 'Test' end as delivery_status from entry e left join entry_collected ec on ec.link_entry_id = e.entry_id where e.entry_type in ('SORD','SRTN') and e.trader_id = 1203046
这两种方案都能得到你想要的结果:包含entry_id、taxpoint_date字段,以及对应的配送状态值,清晰区分待配送和配送中的状态。
内容的提问来源于stack exchange,提问作者Tim Clixby
相关产品推荐
相关产品推荐

