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

如何在SQL查询中显示默认值而非隐藏无维修操作的记录?

问题:如何让SQL查询返回全部订单记录(含无维修操作的NULL值)

我正在完成大学维修服务系统的表结构项目,每个订单需包含诊断操作员ID与维修操作员ID。目前共有10条订单记录,所有订单均有诊断操作员,但仅3条有维修操作员。执行下方SQL查询时仅返回3条记录,其余7条因无维修操作被隐藏。如何修改查询以返回全部10条记录,让无维修操作的记录显示默认值(如NULL)?

说明:

  • OPERATION_TYPE_ID = 2 代表诊断操作
  • OPERATION_TYPE_ID = 1 代表维修操作
  • 若移除查询的最后一行条件,可返回全部10条记录。

原查询代码:

SELECT 
    MODEL AS "Model", 
    ENTRY_DATE AS "Entry date", 
    CLIENT_ID AS "Client ID",
    DEVICE_TYPE AS "Device type",
    OO1.OPERATOR_ID AS "Operator diagnostic",
    OO2.OPERATOR_ID AS "Operator repair"
FROM 
    P_DEVICE D, 
    P_ORDER O, 
    P_DEVICE_TYPE T, 
    P_ORDER_OPERATION OO1, 
    P_ORDER_OPERATION OO2
WHERE 
    D.DEVICE_ID = O.DEVICE_ID AND
    D.DEVICE_TYPE_ID = T.DEVICE_TYPE_ID AND
    (OO1.ORDER_ID = O.ORDER_ID AND OO1.OPERATION_TYPE_ID = 2) AND
    (OO2.ORDER_ID = O.ORDER_ID AND OO2.OPERATION_TYPE_ID = 1)

解决方法

把针对维修操作的P_ORDER_OPERATION表(OO2)的内连接改成左连接,同时改用标准JOIN语法替代旧的逗号分隔表写法,提升可读性。修改后即可保留所有订单记录,无维修操作的记录中Operator repair字段会显示NULL。

修改后的查询代码:

SELECT 
    D.MODEL AS "Model", 
    O.ENTRY_DATE AS "Entry date", 
    O.CLIENT_ID AS "Client ID",
    T.DEVICE_TYPE AS "Device type",
    OO1.OPERATOR_ID AS "Operator diagnostic",
    OO2.OPERATOR_ID AS "Operator repair"
FROM 
    P_DEVICE D
JOIN P_ORDER O ON D.DEVICE_ID = O.DEVICE_ID
JOIN P_DEVICE_TYPE T ON D.DEVICE_TYPE_ID = T.DEVICE_TYPE_ID
JOIN P_ORDER_OPERATION OO1 ON OO1.ORDER_ID = O.ORDER_ID AND OO1.OPERATION_TYPE_ID = 2
LEFT JOIN P_ORDER_OPERATION OO2 ON OO2.ORDER_ID = O.ORDER_ID AND OO2.OPERATION_TYPE_ID = 1

关键说明

  • 内连接(JOIN):用于关联设备、订单、设备类型和诊断操作表,因为所有订单都有诊断记录,内连接能确保这部分数据的匹配性。
  • 左连接(LEFT JOIN):以左侧已关联的订单数据集为基础,即使右侧维修操作表没有对应记录,也会保留左侧的订单行,右侧未匹配的字段自动填充为NULL,正好满足显示全部10条订单的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 19:25:30