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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.09 18:00:01