我有两个表,它们返回3列(帐户编号,金额,站点编号)
样本: 表#1
111111, 200, 14
111111,-200, 14
111111, 400, 15
111111, -400, 15
表#2
111111, 201, 14
111111,-200, 14
111111, 400, 15
111111, -400, 15
我正在尝试嫁接到一个查询,该查询不仅会向我显示两个表之间的差异,例如减号或不存在的地方,还能让我将与一个表不同的数据透视表返回到列中
类似这样的东西:
Act#: TblA Amount TblB Amount Site
111111, 200, 201, 14
当我使用减号时,它只是将顶部表中的行返回给我,所以如果我这样做了:
select * from TblA
MINUS
select * from TblB
结果:
111111, 200, 14
我知道一定有办法做到这一点,任何帮助都会很棒!
答案 0 :(得分:1)
也许以下查询会有所帮助。原理:找出表格之间的差异(A的内容减去B的内容,反之亦然), 然后在连接中使用它们,以“折叠”结果集。使用测试数据(Oracle 12c):
(
select c1, c2, c3, 'in table#1' location from table#1
minus
select c1, c2, c3, 'in table#1' from table#2
)
union all
(
select c1, c2, c3, 'in table#2 (not in table#1)' from table#2
minus
select c1, c2, c3, 'in table#2 (not in table#1)' from table#1
);
-- result
C1 C2 C3 LOCATION
---------- ---------- ---------- ---------------------------
111111 200 14 in table#1
111111 201 14 in table#2 (not in table#1)
如果C1 / C3组合没有重复项,则以下JOIN将为您提供所需的结果。 (也许对于您的情况,这将“足够好” ...)
select
A.c1
--, B.c1
, A.c2
, B.c2
, A.c3
--, B.c3
from
(
select * from table#1
minus
select * from table#2
) A join (
select * from table#2
minus
select * from table#1
) B on A.c1 = B.c1 and A.c3 = B.c3
;
-- result
C1 C2 C2 C3
---------- ---------- ---------- ----------
111111 200 201 14
答案 1 :(得分:0)
您可以使用FULL JOIN
:
SELECT *
FROM tabA a
FULL JOIN tabB b
ON a.id = b.id -- here should be PK or UNIQUE col
WHERE NOT EXISTS (SELECT a.Account, a.Amount, a.Site_Number FROM dual
INTERSECT
SELECT b.Account, b.Amount, b.Site_Number FROM dual);