Oracle SQL用于比较数据并检索Oracle DB中两个表之间的不匹配行

时间:2015-12-28 20:52:41

标签: sql oracle data-warehouse business-intelligence informatica

我正在尝试使用Oracle SQL比较两个表之间的数据。 SQL必须比较数据,并且必须从表中返回不匹配的数据。有没有人有任何想法执行此操作?我可以使用SQL或使用Informatica执行相同操作。请帮帮我。提前谢谢。

注意:它们可能具有相同的结构,因为我将创建一个ID,Qty,Price的TEMP表A. A将与B(ID,数量,价格)进行比较。 A来自EBS,TEMP A是在Oracle中创建的。 B来自数据仓库,存在于Oracle DB中。

1 个答案:

答案 0 :(得分:1)

您可以使用集合比较2个表中的行:取两个表的并集,并从中减去它们的交集。

(
select id, qty, price from table_a
union
select id, qty, price from table_b
)
minus
(
select id, qty, price from table_a
intersect
select id, qty, price from table_b
);

这将为您提供哪些行与相反的表不匹配,但您将无法从该查询中判断哪一行来自哪个表。这应该很容易获得,将结果与原始表连接(或再次交叉,尽管如果表具有主键,连接应该更便宜)。

with t as (
(
select id, qty, price from table_a
union
select id, qty, price from table_b
)
minus
(
select id, qty, price from table_a
intersect
select id, qty, price from table_b
))
select *
  from t
  join table_a a on t.id = a.id;

同样可以加入table_b,找出哪些行与table_a不匹配。

运行样本:

SQL> create table table_a (id number, qty number, price number);
Table created
SQL> insert into table_a values (1, 100, 1.1);
1 row inserted
SQL> insert into table_a values (2, 200, 2.2);
1 row inserted
SQL> insert into table_a values (3, 300, 3.3);
1 row inserted
SQL> create table table_b (id number, qty number, price number);
Table created
SQL> insert into table_b values (1, 100, 1.1);
1 row inserted
SQL> insert into table_b values (2, 200, 2.2);
1 row inserted
SQL> insert into table_b values (4, 300, 3.3);
1 row inserted
SQL> insert into table_b values (5, 500, 5.5);
1 row inserted
SQL> (
  2  select id, qty, price from table_a
  3  union
  4  select id, qty, price from table_b
  5  )
  6  minus
  7  (
  8  select id, qty, price from table_a
  9  intersect
 10  select id, qty, price from table_b
 11  );
        ID        QTY      PRICE
---------- ---------- ----------
         3        300        3,3
         4        300        3,3
         5        500        5,5
SQL> with t as (
  2  (
  3  select id, qty, price from table_a
  4  union
  5  select id, qty, price from table_b
  6  )
  7  minus
  8  (
  9  select id, qty, price from table_a
 10  intersect
 11  select id, qty, price from table_b
 12  ))
 13  select *
 14    from t
 15    join table_a a on t.id = a.id;
        ID        QTY      PRICE         ID        QTY      PRICE
---------- ---------- ---------- ---------- ---------- ----------
         3        300        3,3          3        300        3,3

SQL>