SSMS连接Oracle跨库查询各类JOIN返回行数异常问题求助
问题根因
你遇到的是JOIN语句过滤条件位置错误导致的结果异常,和SSMS、Oracle兼容性无关。
当你使用LEFT JOIN时,右表V_FTS_SUM的过滤条件写在WHERE子句中,会将右表字段为NULL的不匹配行直接过滤,最终效果等同于INNER JOIN;同理RIGHT JOIN时,左表的过滤条件写在WHERE中也会过滤掉左表字段为NULL的不匹配行,所以无论用哪种JOIN类型,最终都只返回310行匹配成功的结果。
修复方案
1. 查找左表(新系统)存在、右表(旧系统)缺失的记录
将右表的过滤条件移至JOIN的ON子句中,左表过滤条件保留在WHERE子句即可:
SELECT E.*, V.* FROM Database1.ACCT_EOM_TRANSACTIONS E LEFT JOIN Database2.V_FTS_SUM V ON E.eq_equip_no = V.veh_ref_no -- 右表过滤条件写在ON中 AND V.bill_month = 9 AND V.bill_year = 2021 AND V.trans_type = 'DEPR' WHERE -- 左表过滤条件保留在WHERE E.period_id = '092021' AND E.trans_type IN ('DEPRECIATION', 'OTHER FIXED 3') ORDER BY E.eq_equip_no
执行后会返回312行,其中2行的V字段全部为NULL,就是左表独有的记录。
2. 查找右表存在、左表缺失的记录
可以用RIGHT JOIN按同样逻辑调整,也可以直接用FULL OUTER JOIN一次性定位所有差异:
SELECT E.*, V.* FROM Database1.ACCT_EOM_TRANSACTIONS E FULL OUTER JOIN Database2.V_FTS_SUM V ON E.eq_equip_no = V.veh_ref_no AND E.period_id = '092021' AND E.trans_type IN ('DEPRECIATION', 'OTHER FIXED 3') AND V.bill_month = 9 AND V.bill_year = 2021 AND V.trans_type = 'DEPR' -- 只返回两边不匹配的差异行 WHERE E.eq_equip_no IS NULL OR V.veh_ref_no IS NULL
执行后会返回3条差异记录:2条左表独有、1条右表独有。
补充排查点
如果调整后结果仍然不符合预期,可以依次排查:
- 关联字段
eq_equip_no和veh_ref_no是否存在大小写差异、尾随空格、数据类型不一致(比如char和varchar的隐式转换问题) - 确认连接Oracle的账号是否有
V_FTS_SUM的全量访问权限,避免行级权限控制导致部分记录不可见 - 直接在Oracle原生客户端执行相同SQL对比结果,排除SSMS的Oracle驱动版本过旧导致的结果异常
内容的提问来源于stack exchange,提问作者kzoom
相关产品推荐
相关产品推荐

