Nó sẽ không được nhanh chóng, và sẽ có rất nhiều để bạn gõ (trừ khi bạn tạo SQL từ user_tab_columns), nhưng đây là những gì tôi sử dụng khi tôi cần phải so sánh hai bảng hàng-by-hàng và cột- theo cột.
Các truy vấn sẽ trả lại tất cả các hàng mà
- Tồn tại trong table1 nhưng không phải trong table2
- Tồn tại trong table2 nhưng không phải trong table1
- Tồn tại trong cả hai bảng, nhưng có ít nhất một cột với một giá trị khác nhau
(các hàng giống nhau thông thường sẽ bị loại trừ).
"PK" là (các) cột tạo nên khóa chính của bạn. "a" sẽ chứa A nếu hàng hiện tại tồn tại trong bảng 1. "b" sẽ chứa B nếu hàng hiện tại tồn tại trong bảng 2.
select pk
,decode(a.rowid, null, null, 'A') as a
,decode(b.rowid, null, null, 'B') as b
,a.col1, b.col1
,a.col2, b.col2
,a.col3, b.col3
,...
from table1 a
full outer
join table2 b using(pk)
where decode(a.col1, b.col1, 1, 0) = 0
or decode(a.col2, b.col2, 1, 0) = 0
or decode(a.col3, b.col3, 1, 0) = 0
or ...;
Sửa Added mã ví dụ để thấy sự khác biệt được mô tả trong nhận xét. Bất cứ khi nào một trong các giá trị chứa NULL, kết quả sẽ khác nhau.
with a as(
select 0 as col1 from dual union all
select 1 as col1 from dual union all
select null as col1 from dual
)
,b as(
select 1 as col1 from dual union all
select 2 as col1 from dual union all
select null as col1 from dual
)
select a.col1
,b.col1
,decode(a.col1, b.col1, 'Same', 'Different') as approach_1
,case when a.col1 <> b.col1 then 'Different' else 'Same' end as approach_2
from a,b
order
by a.col1
,b.col1;
col1 col1_1 approach_1 approach_2
==== ====== ========== ==========
0 1 Different Different
0 2 Different Different
0 null Different Same <---
1 1 Same Same
1 2 Different Different
1 null Different Same <---
null 1 Different Same <---
null 2 Different Same <---
null null Same Same
Tại sao câu trả lời đó lại được chấp nhận? Nó không làm phần khó nhất là xác định cột không khớp. –