Oracle SQL 比较数据并检索 Oracle DB 中两个表之间不匹配的行
Oracle SQL to compare data and retrieve un-matching rows between two tables in Oracle DB
我正在尝试使用 Oracle SQL 比较两个 table 之间的数据。 SQL 必须比较数据并且必须 return 来自 table 的不匹配数据。有谁知道执行此操作吗?我可能会使用 SQL 或使用 Informatica 来执行此操作。请帮帮我。提前致谢。
注意:它们可能具有相同的结构,因为我将创建一个带有 ID、数量、价格的 TEMP table A。 A 将与 B (ID, Qty,Price) 进行比较。 A 来自 EBS,TEMP A 是在 Oracle 中创建的。 B 来自数据仓库,存在于 Oracle 数据库中。
您可以使用集合比较 2 table 中的行:取两个 table 的并集并从中减去它们的交集。
(
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
);
这将为您提供哪些行与相反的 table 不匹配,但您无法从该查询中分辨出哪些行来自哪个 table。这应该很容易获得,将结果与原始 table 连接(或再次相交,尽管鉴于 table 具有主键,连接应该更便宜)。
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>
我正在尝试使用 Oracle SQL 比较两个 table 之间的数据。 SQL 必须比较数据并且必须 return 来自 table 的不匹配数据。有谁知道执行此操作吗?我可能会使用 SQL 或使用 Informatica 来执行此操作。请帮帮我。提前致谢。
注意:它们可能具有相同的结构,因为我将创建一个带有 ID、数量、价格的 TEMP table A。 A 将与 B (ID, Qty,Price) 进行比较。 A 来自 EBS,TEMP A 是在 Oracle 中创建的。 B 来自数据仓库,存在于 Oracle 数据库中。
您可以使用集合比较 2 table 中的行:取两个 table 的并集并从中减去它们的交集。
(
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
);
这将为您提供哪些行与相反的 table 不匹配,但您无法从该查询中分辨出哪些行来自哪个 table。这应该很容易获得,将结果与原始 table 连接(或再次相交,尽管鉴于 table 具有主键,连接应该更便宜)。
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>