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

