Oracle SQL查询无匹配行时返回固定值MISSING的实现咨询
问题核心原因
你当前使用的是隐式内连接,当T_SUPPLY_LOCATION表没有匹配的关联记录时,整行数据会直接被过滤,NVL函数只能处理字段本身为NULL的场景,无法覆盖无匹配行的情况。
解决方案
将T_SUPPLY_LOCATION的关联逻辑改为左外连接,同时把关联条件从WHERE子句移到LEFT JOIN的ON子句中即可,修改后的完整SQL如下:
SELECT THC.TRAN_HDR_CATEGORY_PK AS "DB ID", 'PBI' AS "Order Type", THC.INVOICE_NUMBER AS "Invoice Number", supl.SUPPLY_CODE AS "Vendor Code", supl.supply_name AS "Vendor Name", LOC.location_name AS "Location Name", NVL(sloc.export_code, 'MISSING') AS "LOC Vendor Export Code", THC.INVOICE_AMOUNT AS "Invoice Amount", THC.ENTRY_DATE AS "Order Date", CASE WHEN (THC.Extract_AP_PK) IS NULL THEN 'NO' ELSE 'YES' END AS "Exported" FROM T_TRAN_HDR_CATEGORY THC INNER JOIN t_location loc ON THC.LOCATION_ID = LOC.location_id INNER JOIN t_supply supl ON supl.supply_id = THC.SUPPLY_ID LEFT JOIN T_SUPPLY_LOCATION sloc ON THC.LOCATION_ID = SLOC.LOCATION_ID AND THC.SUPPLY_ID = SLOC.supply_id WHERE THC.ENTRY_DATE >= SYSDATE -7
改动说明
- 把原来逗号分隔的隐式连接改为显式JOIN语法,逻辑更清晰可维护
- 对
T_SUPPLY_LOCATION使用左外连接,保证主表T_TRAN_HDR_CATEGORY的行不会因为sloc无匹配而被过滤 - 关联
sloc的条件全部移到LEFT JOIN的ON子句中,如果留在WHERE子句里,无匹配时sloc的字段为NULL会触发WHERE条件过滤,等同于变回内连接 - 原有
NVL(sloc.export_code, 'MISSING')逻辑保留即可:不管是sloc匹配到但export_code为NULL,还是sloc完全无匹配行,sloc.export_code都会返回NULL,NVL都会统一返回MISSING,完全符合需求。
内容的提问来源于stack exchange,提问作者tartarus
相关产品推荐
相关产品推荐

