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

SQL运输状态异常查询:修正现有语句逻辑错误

问题:统计未成功传输的收据记录

我有两张表Transport_Status和Receipts,id为关联主键,且Transport_Status中id可重复存在。需要统计收据的传输情况,仅展示未出现200状态码的结果(仅显示错误码900的记录及无运输记录的收据)。

现有SQL语句如下:

Select * from Transport_Protocoll 
inner join Receipts on Transport_Protocoll.id=Receipts.id
where not exists(select * where TRANSPORT_STATUS=200)

但该语句在存在TRANSPORT_STATUS=200的情况下,仍会返回对应ID的900错误结果。


表数据

Transport_Protocolls表

IDTransport_StatusTransport_DetailDate
1111126900Network is unreachable (connect failed)10.07.2024
1111126200receipt send successfully14.07.2024
1111127900Network is unreachable (connect failed)10.07.2024

Receipts表

IDorder_datearticleDate
11111261.07.2024Ice Cream10.07.2024
11111271.01.2024Yogurt03.07.2024
11111281.05.2024Bogey Man03.07.2024

预期结果

IDTransport_StatusTransport_DetailDate
1111127900Network is unreachable (connect failed)10.07.2024
1111128nullnullnull

原因:ID为1111126的收据虽曾传输失败,但后续已成功发送;ID为1111127从未成功发送,ID为1111128无运输记录。


修正后的SQL语句

要实现需求,需先筛选出从未出现过200状态码的ID,再关联获取对应的传输记录(或空记录),以下两种写法均可:

写法1:使用NOT IN

SELECT 
    r.ID,
    tp.Transport_Status,
    tp.Transport_Detail,
    tp.Date
FROM Receipts r
LEFT JOIN Transport_Protocolls tp ON r.ID = tp.ID
WHERE r.ID NOT IN (
    SELECT DISTINCT ID 
    FROM Transport_Protocolls 
    WHERE Transport_Status = 200
)

写法2:使用NOT EXISTS

SELECT 
    r.ID,
    tp.Transport_Status,
    tp.Transport_Detail,
    tp.Date
FROM Receipts r
LEFT JOIN Transport_Protocolls tp ON r.ID = tp.ID
WHERE NOT EXISTS (
    SELECT 1 
    FROM Transport_Protocolls tp2 
    WHERE tp2.ID = r.ID 
      AND tp2.Transport_Status = 200
)

逻辑说明

  1. 子查询先定位所有存在成功传输(状态200)的收据ID;
  2. 主查询用LEFT JOIN关联两张表,确保无运输记录的收据也能被纳入结果;
  3. 通过过滤条件排除所有有过成功传输记录的ID,最终只保留从未成功的收据(含无运输记录的)。

内容的提问来源于stack exchange,提问作者verklixt

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 01:00:14