You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 12:12:45