两个 SELECT 返回不同的计数,但所有类型的 JOIN 返回相同的行数,<> SELECT



(使用SSMS v15对一对Oracle v19 dbs)

在新管理系统的db1中对表1进行SELECT,返回当月的312个折旧trxns。

SELECT against View1在旧管理系统的db2中返回当月311个折旧交易。

在自制系统和新出售的系统之间存在差异是预料之中的,但是通过观察每个结果集的结果来发现它们让我的眼睛很疼,我有大约4500行各种类型的交易需要验证…

我想要join来显示哪一边的join在另一边是缺失的。这些差异可能是双向的。

所以我想要一个LEFT JOIN语句,显示第一个SELECT中的所有312行,并为另一个SELECT中缺失的行提供null。

AND我想要一个右连接的语句,显示311行从第二个SELECT,和null从其他缺失的任何行。

但是每个JOIN返回310行。

我没有遍历所有310以查看是否所有四种JOIN类型都返回了相同的310,但是每次都是310行。

可能性:SQL Server Mgmt Studio不适合Oracle?VIEW有副作用吗?操作员错误呢?

如有任何帮助,不胜感激。

感谢

select *  -- = 312 rows
from Database1.ACCT_EOM_TRANSACTIONS
where period_id = '092021'
and trans_type in ('DEPRECIATION', 'OTHER FIXED 3')
order by trans_type, eq_equip_no

select * -- = 311 rows
from Database2.V_FTS_SUM 
where bill_month = 9 and bill_year = 2021
and trans_type = 'DEPR'
order by trans_type, veh_ref_no
Select E.*, V.* 
from Database1.ACCT_EOM_TRANSACTIONS E
JOIN Database2.V_FTS_SUM V  --INNER, RIGHT OUTER, LEFT OUTER, JOIN = 310 rows
ON E.eq_equip_no = V.veh_ref_no
where 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'
order by E.eq_equip_no

您的WHERE子句违反了外部连接行为。

要查找左右两侧的不匹配,请使用FULL [OUTER] JOIN,如下所示:

WITH cte1 AS (
select *  -- = 312 rows
from ACCT_EOM_TRANSACTIONS
where period_id = '092021'
and trans_type in ('DEPRECIATION', 'OTHER FIXED 3')
)
, cte2 AS (
select * -- = 311 rows
from V_FTS_SUM 
where bill_month = 9 and bill_year = 2021
and trans_type = 'DEPR'
)
SELECT *
FROM cte1 FULL JOIN cte2
ON cte1.eq_equip_no = cte2.veh_ref_no
WHERE cte1.eq_equip_no IS NULL
OR cte2.veh_ref_no  IS NULL
;

小提琴:https://dbfiddle.uk/?rdbms=oracle_18&小提琴= 4 c68480cdfc5b9d06d5d70ade66235e3

最新更新