两个表的差异显示单列中行的差异

时间:2018-10-10 15:21:11

标签: sql oracle

我有两个表,它们返回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

我知道一定有办法做到这一点,任何帮助都会很棒!

2 个答案:

答案 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

Dbfiddle here.

答案 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);

db<>fiddle demo