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表
| ID | Transport_Status | Transport_Detail | Date |
|---|---|---|---|
| 1111126 | 900 | Network is unreachable (connect failed) | 10.07.2024 |
| 1111126 | 200 | receipt send successfully | 14.07.2024 |
| 1111127 | 900 | Network is unreachable (connect failed) | 10.07.2024 |
Receipts表
| ID | order_date | article | Date |
|---|---|---|---|
| 1111126 | 1.07.2024 | Ice Cream | 10.07.2024 |
| 1111127 | 1.01.2024 | Yogurt | 03.07.2024 |
| 1111128 | 1.05.2024 | Bogey Man | 03.07.2024 |
预期结果
| ID | Transport_Status | Transport_Detail | Date |
|---|---|---|---|
| 1111127 | 900 | Network is unreachable (connect failed) | 10.07.2024 |
| 1111128 | null | null | null |
原因: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 )
逻辑说明
- 子查询先定位所有存在成功传输(状态200)的收据ID;
- 主查询用
LEFT JOIN关联两张表,确保无运输记录的收据也能被纳入结果; - 通过过滤条件排除所有有过成功传输记录的ID,最终只保留从未成功的收据(含无运输记录的)。
内容的提问来源于stack exchange,提问作者verklixt
相关产品推荐
相关产品推荐

