如何在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
相关产品推荐
相关产品推荐

