una - oracle diff: ¿cómo comparar dos tablas?
scripts oracle ejemplos (10)
Supongamos que tengo dos tablas, t1 y t2 que tienen un diseño idéntico pero que pueden contener datos diferentes.
¿Cuál es la mejor manera de diferenciar estas dos tablas?
Además de algunas de las otras respuestas proporcionadas, si quisiera ver las diferencias en la estructura de la tabla con una tabla que podría tener una estructura similar pero diferente, podría hacerlo de varias maneras:
Primero : si usa Oracle SQL Developer, puede ejecutar una descripción en ambas tablas para compararlas:
descr TABLE_NAME1
descr TABLE_NAME2
Segundo : la primera solución puede no ser ideal para tablas más grandes con muchas columnas. Si solo desea ver las diferencias en los datos entre las dos tablas, entonces, como lo mencionaron otras muchas, el operador SQL Menos debería hacer el trabajo.
Tercero : si está utilizando Oracle SQL Developer y desea comparar la estructura de tablas de dos tablas con diferentes esquemas, puede hacer lo siguiente:
- Seleccione "herramientas"
- Seleccione "Base de Datos Diff"
- Seleccione "Fuente de conexión"
- Seleccione "Conexión de destino"
- Seleccione los "Tipos de objetos estándar" que desea comparar
- Ingrese el "Nombre de la tabla"
- Haga clic en "Siguiente" hasta que llegue a "Finalizar"
- Haga clic en "Finalizar"
- NOTA: En los pasos 3 y 4 es donde seleccionará los diferentes esquemas en los que existen los objetos que desea comparar.
Cuarto : si las tablas dos tablas que desea comparar tienen más columnas, están en el mismo esquema, no tienen necesidad de comparar más de dos tablas y no son atractivas para comparar visualmente con el comando DESCR, puede usar lo siguiente para comparar las diferencias en la estructura de la mesa:
select
a.column_name || '' | '' b.column_name,
a.data_type || '' | '' b.data_type,
a.data_length || '' | '' b.data_length,
a.data_scale || '' | '' b.data_scale,
a.data_precision || '' | '' b.data_precision
from
user_tab_columns a,
user_tab_columns b
where
a.table_name = ''TABLE_NAME1''
and b.table_name = ''TABLE_NAME2''
and (
a.data_type <> b.data_type or
a.data_length <> b.data_length or
a.data_scale <> b.data_scale or
a.data_precision <> b.data_precision
)
and a.column_name = b.column_name;
Para este tipo de pregunta, creo que tiene que ser muy específico sobre lo que está buscando, ya que hay muchas maneras de interpretarlo y muchos enfoques diferentes. Algunos enfoques serán un martillo demasiado grande si su pregunta no lo justifica.
En el nivel más simple, hay "¿Los datos de la tabla son exactamente iguales o no?", Que puede intentar responder con una comparación de recuento simple antes de pasar a algo más complejo.
En el otro extremo de la escala hay "mostrarme las filas de cada tabla para las que no hay una fila equivalente en la otra tabla" o "mostrarme donde las filas tienen la misma clave de identificación pero diferentes valores de datos".
Si realmente desea sincronizar la Tabla A con la Tabla B, entonces eso podría ser relativamente sencillo, utilizando un comando MERGE.
Prueba esto:
(select * from T1 minus select * from T2) -- all rows that are in T1 but not in T2
union all
(select * from T2 minus select * from T1) -- all rows that are in T2 but not in T1
;
Ninguna herramienta externa. No hay problemas de rendimiento con la union all
.
Puede probar dbForge Data Compare for Oracle , una ** herramienta de GUI gratuita para la comparación y sincronización de datos, que puede realizar estas acciones en toda la base de datos o parcialmente.
Puedes intentar usar las operaciones de ajuste: MINUS
e INTERSECT
Consulte aquí para obtener más detalles: http://oreilly.com/catalog/mastorasql/chapter/ch07.html
Si tiene dinero para gastar, use la herramienta PowerDIFF para Oracle: http://www.orbit-db.com . Viene con varias opciones de comparación y hace este tipo de trabajos de manera excelente.
Solución rápida:
SELECT * FROM TABLE1
MINUS
SELECT * FROM TABLE2
Ningún registro debe mostrar ...
Tratar:
select distinct T1.id
from TABLE1 T1
where not exists (select distinct T2.id
from TABLE2 T2
where T2.id = T1.id)
Con sql oracle 11g +
select * from table1 where table1.col1 in (select table2.col1 from table2)
Suponiendo que col1
es la columna de clave principal y esto dará todas las filas en la table1
respectiva a la columna 1 de la table2
2.
select * from table1 where table1.col1 not in (select table2.col1 from table2)
Espero que esto ayude