No será rápido, y habrá mucho para que escriba (a menos que genere el SQL de user_tab_columns), pero esto es lo que uso cuando necesito comparar dos tablas fila por fila y columna- por columna
La consulta devolverá todas las filas que
- existe en la Tabla 1, pero no en tabla2
- existe en tabla2 pero no en tabla1
- existe en ambas tablas, sino que tenga al menos una columna con una valor diferente
(se excluirán las hileras idénticas comunes).
"PK" es la (s) columna (s) que conforman su clave principal. "a" contendrá A si la fila actual existe en la tabla1. "b" contendrá B si la fila actual existe en la tabla2.
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 ...;
Editar Agregado código de ejemplo para mostrar la diferencia descrita en el comentario. Cuando uno de los valores contiene NULL, el resultado será diferente.
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
Por qué es aceptable esa respuesta? No hace la parte más difícil que es especificar la columna que no se corresponde. –