2009-03-27 32 views

risposta

4

È possibile utilizzare uno strumento come AQT per creare diff tra tabelle.

Un altro approccio sarebbe quello di scaricare le tabelle in un file di testo e utilizzare uno strumento diff come WinMerge. Con questo approccio, è possibile utilizzare SQL complesso per trasformare le tabelle nello stesso layout, in primo luogo.

1

Per questo tipo di domanda, penso che devi essere molto specifico su ciò che stai cercando, poiché ci sono molti modi di interpretarlo e molti approcci diversi. Alcuni approcci saranno troppo grandi se la tua domanda non lo giustifica.

Al livello più semplice, c'è "I dati della tabella sono esattamente uguali o no?", Che è possibile tentare di rispondere con un semplice confronto dei conteggi prima di passare a qualcosa di più complesso.

All'altra estremità della scala c'è "mostrami le righe di ogni tabella per le quali non c'è una riga equivalente nell'altra tabella" o "mostrami dove le righe hanno la stessa chiave di identificazione ma valori di dati diversi" .

Se in realtà si desidera sincronizzare la Tabella A con la Tabella B, allora potrebbe essere relativamente semplice, utilizzando un comando MERGE.

+0

Il comando "MERGE" era nuovo per me. Questo fa esattamente il trucco per molte situazioni. – thrag

1

Se si dispone di denaro da spendere, utilizzare lo strumento PowerDIFF per Oracle: http://www.orbit-db.com. Viene fornito con una serie di opzioni di confronto e fa questi tipi di lavoro in modo eccellente.

38

Prova questo:

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

No strumento esterno. Nessun problema di prestazioni con union all.

3

Si può provare dbForge Data Compare for Oracle, uno strumento ** gratuito GUI per il confronto e la sincronizzazione dei dati, che può fare queste azioni su tutto il database o parzialmente.

alt text

1

soluzione veloce:

SELECT * FROM TABLE1 
MINUS 
SELECT * FROM TABLE2 

No records dovrebbero mostrare ...

0

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

Supponendo col1 è la colonna di chiave primaria e questo vi darà tutte le righe in table1 rispettivo alla colonna.

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

Spero che questo aiuti

0

Prova:

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 +