oracle diff: como comparar duas tabelas?

suponha que eu tenho duas tabelas, t1 e t2 que são idênticas em layout mas que podem conter dados diferentes.

Qual é a melhor maneira de diferenciar estas duas mesas?

 25
Author: Mark Harrison, 2009-03-27

10 answers

Pode usar uma ferramenta como AQT para criar diferenças entre tabelas.

Outra abordagem seria transferir as tabelas para um ficheiro de texto e usar uma ferramenta de diferenças como WinMerge. Com esta abordagem, você pode usar SQL complexo para transformar as tabelas no mesmo layout, em primeiro lugar.

 5
Author: Aaron Digulla, 2009-03-27 10:00:15

Tenta isto:

(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
;

Nenhuma ferramenta externa. Sem problemas de desempenho com union all.

 47
Author: L. Holanda, 2015-02-21 19:29:51

Pode tentar usar as operações definidas: MINUS e INTERSECT

Veja aqui para mais detalhes: http://oreilly.com/catalog/mastorasql/chapter/ch07.html

 13
Author: maxyfc, 2009-03-27 04:21:09
Para este tipo de pergunta, acho que você deve ser muito específico sobre o que está procurando, pois há muitas maneiras de interpretá-lo e muitas abordagens diferentes. Algumas abordagens vão ser um martelo muito grande se a sua pergunta não o justifica.

No nível mais simples, Existe " os dados da tabela são exatamente os mesmos ou não?", que você pode tentar responder com uma simples comparação de contagem antes de passar para qualquer coisa mais complexa.

Na outra extremidade da escala de lá é "mostre-me as linhas de cada tabela para a qual não há uma linha equivalente em outra tabela" ou "mostre-me onde linhas têm a mesma identificação de chave, mas diferentes valores de dados".

Se realmente quiser sincronizar a tabela a com a tabela B, isso poderá ser relativamente simples, usando um comando de junção.

 2
Author: David Aldridge, 2009-03-27 14:45:59

Pode tentar comparar dados de dbForge para a Oracle, a * * free Ferramenta GUI para comparação de dados e sincronização, que pode fazer essas ações em todo banco de dados ou parcialmente.

alt text

 2
Author: Devart, 2010-09-24 13:56:44
 1
Author: , 2009-04-07 08:50:45

Solução rápida:

SELECT * FROM TABLE1
MINUS
SELECT * FROM TABLE2
Não devem aparecer registos...
 1
Author: Joan Vilariño, 2013-01-16 15:23:02

select * from table1 where table1.col1 in (select table2.col1 from table2)

Assumindo que col1 é a coluna da chave primária e isto irá dar todas as linhas em table1 respectivas à coluna 1 de table2.

select * from table1 where table1.col1 not in (select table2.col1 from table2)

Espero que isto ajude.
 0
Author: Kumar, 2014-01-30 17:39:15

Tenta:

select distinct T1.id
  from TABLE1 T1
 where not exists (select distinct T2.id
                     from TABLE2 T2
                    where T2.id = T1.id)

Com SQL oracle 11g+

 0
Author: KingRider, 2017-02-01 12:22:00

Além de algumas das outras respostas fornecidas, se você quisesse olhar para as diferenças na estrutura da tabela com uma tabela que poderia ter a estrutura semelhante, mas diferente, você poderia fazer isso de várias maneiras:

First - Se usar o programador SQL Oracle, poderá executar uma descrição em ambas as tabelas para as comparar:

descr TABLE_NAME1
descr TABLE_NAME2

Second - the first solution may not be ideal for larger tables with a lot of columns. Se você só quer ver as diferenças nos dados entre as duas tabelas, então como mencionado por vários outros, usando o operador SQL menos deve fazer o trabalho.

Third - Se estiver a usar o programador SQL Oracle, e quiser comparar a estrutura da tabela de duas tabelas usando esquemas diferentes, poderá fazer o seguinte:

  1. Seleccione "Ferramentas"
  2. Seleccione"Diferenças De Base De Dados"
  3. Seleccione "Ligação De Código"
  4. Seleccione "Ligação De Destino"
  5. Seleccione os "tipos de objectos normais" você quer comparar
  6. indique o"nome da tabela"
  7. clique em "Next" até chegar ao"Finish"
  8. Clique Em "Terminar"
  9. nota: nos passos 3 e 4 é onde poderá seleccionar os diferentes esquemas em que os objectos existem que deseja comparar.

Quarto - Se as tabelas que deseja comparar têm mais colunas, estão no mesmo esquema, não têm necessidade de comparar mais do que duas tabelas e não são atraentes para comparar visualmente usando o descritor comando poderá usar o seguinte para comparar as diferenças na estrutura da tabela:

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;
 0
Author: Rex CoolCode Charles, 2018-06-21 19:01:41