如何编写SQL查询所有已受理且出具期限为2天的维修物品
问题排查与解决方案
原SQL存在的问题
- 表关联条件错误:
Orders和Items的关联外键是Orders.ItemsID,不是Orders.ID,原关联条件Orders.ID = Items.ID会导致关联结果完全不匹配,得到错误的物品数据 - 筛选条件硬编码:直接固定
Date_of_deadline = '2021-11-18'只能查询特定日期到期的记录,无法匹配所有「受理到出具结果期限为2天」的记录 - 缺少已受理状态筛选:没有过滤已受理的状态条件,会将已提交、待备件等其他状态的订单也查询出来
- 冗余字段:SELECT子句中重复查询了两次
Status_items,属于无效冗余
正确实现方案
需求拆解:匹配已受理状态的维修物品 + 受理日期到截止日期间隔为2天,适配当前SQL Server数据库的实现如下:
SELECT i.ItemsName, i.Status_items, o.Date_of_acceptance, o.Date_of_deadline, o.Type_of_repair FROM Orders o INNER JOIN Items i ON o.ItemsID = i.ID WHERE -- 筛选已受理状态,可根据实际业务规则调整判断条件 o.Status_order = 'Accept' AND i.Status_items LIKE 'Accept%' -- 计算受理到截止期限间隔为2天 AND DATEDIFF(day, o.Date_of_acceptance, o.Date_of_deadline) = 2
执行结果说明
基于提供的测试数据执行上述SQL,会返回2条符合要求的记录:
- 打印机,物品状态为「Accept for the repair 」,受理日期2021-11-16,截止日期2021-11-18,维修类型为笔记本碎屏
- 电脑,物品状态为「Unclaimed」,受理日期2021-7-12,截止日期2021-7-14,维修类型为更换笔记本电池
内容的提问来源于stack exchange,提问作者Petya
相关产品推荐
相关产品推荐

