You need to enable JavaScript to run this app. ORACLE 10G新手:不用UNION实现订单发票货品数量并排对比查询
优惠活动
大模型
产品
解决方案
定价
更多

ORACLE 10G新手:不用UNION实现订单发票货品数量并排对比查询

Oracle 10G 无UNION实现订单-发票并排对比查询方案

实现核心逻辑

你之前用UNION得到的是纵向上下堆叠的结果,当前需求的本质是将两个独立的行集(订单行、发票行)按货品唯一标识做横向拼接,Oracle 10G 完全支持全外连接语法,可以直接实现需求,不需要依赖UNION:

  • 针对两边都存在的货品(如示例中的TITLE2、TITLE3、TITLE4),将订单侧的数量、发票侧的数量放到同一行展示
  • 针对只存在于其中一侧的货品(如只有订单没有发票的TITLE1),缺失侧的字段自动留空,不会遗漏数据

可直接运行的查询语句

-- 订单侧数据集:提取需要对比的00PAT类订单行
WITH order_lines AS (
    SELECT 
        CUS.CODE AS cus_code,
        CUS.NAME AS cus_name,
        F1.ID AS order_id,
        F1.FTRDATE AS order_ftrdate,
        F1.TRADECODE AS order_tradecode,
        MAT.SUBCODE1 AS item_subcode,
        MAT.DESCRIPTION AS item_desc,
        S1.PRIMARYQTY AS order_qty
    FROM CUSTOMER CUS
    INNER JOIN FINTRADE F1 
        ON CUS.ID = F1.CUSID
    INNER JOIN STORETRADELINES S1 
        ON S1.FTRID = F1.ID
    INNER JOIN MATERIAL MAT 
        ON MAT.ID = S1.ITEID
    WHERE F1.DSRID = '14500' 
      AND F1.FTRDATE = '13/4/2021'
),
-- 发票侧数据集:提取需要对比的553028类发票行
invoice_lines AS (
    SELECT 
        CUS.CODE AS cus_code,
        CUS.NAME AS cus_name,
        F2.ID AS invoice_id,
        F2.FTRDATE AS invoice_ftrdate,
        F2.TRADECODE AS invoice_tradecode,
        MAT.SUBCODE1 AS item_subcode,
        MAT.DESCRIPTION AS item_desc,
        S2.PRIMARYQTY AS invoice_qty
    FROM CUSTOMER CUS
    INNER JOIN FINTRADE F2 
        ON CUS.ID = F2.CUSID
    INNER JOIN STORETRADELINES S2 
        ON S2.FTRID = F2.ID
    INNER JOIN MATERIAL MAT 
        ON MAT.ID = S2.ITEID
    WHERE F2.DSRID = '15500' 
      AND F2.FTRDATE = '14/4/2021'
)
-- 全外连接拼接两个数据集,实现同货品并排展示
SELECT
    -- 公共字段做非空兜底,避免某侧无数据时显示空值
    COALESCE(o.cus_code, i.cus_code) AS 客户编码,
    COALESCE(o.cus_name, i.cus_name) AS 客户名称,
    COALESCE(o.item_subcode, i.item_subcode) AS 货品编码,
    COALESCE(o.item_desc, i.item_desc) AS 货品名称,
    -- 订单侧字段单独成列
    o.order_id AS 订单单号,
    o.order_ftrdate AS 订单日期,
    o.order_tradecode AS 订单贸易编码,
    o.order_qty AS 订单数量,
    -- 发票侧字段单独成列
    i.invoice_id AS 发票单号,
    i.invoice_ftrdate AS 发票日期,
    i.invoice_tradecode AS 发票贸易编码,
    i.invoice_qty AS 发票数量
FROM order_lines o
FULL OUTER JOIN invoice_lines i
    ON o.cus_code = i.cus_code  -- 同一客户才匹配,避免跨客户串数据
   AND o.item_subcode = i.item_subcode  -- 同一货品才匹配,实现横向拼接
ORDER BY 货品编码; -- 按货品排序,方便逐行对比

新手注意事项

  • 为什么用全外连接而不是内连接/左右连接:内连接会把只在单边存在的货品过滤掉,左/右连接会把另一侧独有的货品过滤掉,只有全外连接能完整保留两边的所有货品记录
  • 关联匹配键必须选对:要用MAT.SUBCODE1(物料内部唯一编码)做匹配,不要用货品名称匹配,避免同名不同货、名称变更导致的错配
  • 关联条件必须加上客户编码匹配:避免跨客户的同编码货品被错误匹配到一起
  • 如果你的10G版本不支持WITH子句,可以把两个子查询替换成内联视图,语法逻辑完全一致
  • 如果运行后出现同货品重复行,说明订单或发票侧存在同一货品多行的情况,可以在子查询里按货品编码做数量汇总后再连接

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.24 19:06:04