web-dev-qa-db-fra.com

oracle diff: comment comparer deux tables?

Supposons que je dispose de deux tableaux, t1 et t2, dont la présentation est identique mais qui peuvent contenir des données différentes.

Quelle est la meilleure façon de différencier ces deux tables?

25
Mark Harrison

Vous pouvez utiliser un outil tel que AQT pour créer des différences entre les tables.

Une autre approche consisterait à convertir les tableaux dans un fichier texte et à utiliser un outil de comparaison tel que WinMerge . Avec cette approche, vous pouvez utiliser un SQL complexe pour transformer les tables dans la même présentation, en premier lieu.

5
Aaron Digulla

Essaye ça:

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

Aucun outil externe. Aucun problème de performance avec union all.

47
L. Holanda

Vous pouvez essayer d'utiliser les opérations définies: MINUS et INTERSECT

Voir ici pour plus de détails: http://oreilly.com/catalog/mastorasql/chapter/ch07.html

13
maxyfc

Vous pouvez essayer dbForge Data Compare pour Oracle, un outil graphique ** gratuit pour la comparaison et la synchronisation de données, qui peut effectuer ces actions sur toutes les bases de données ou partiellement.

alt text

2
Devart

Pour ce type de question, je pense que vous devez être très précis sur ce que vous recherchez, car il existe de nombreuses façons de l'interpréter et de nombreuses approches différentes. Certaines approches vont devenir trop difficiles si votre question ne le justifie pas.

Au niveau le plus simple, il y a "Les données de la table sont-elles exactement identiques ou non?", Auxquelles vous pouvez essayer de répondre avec une simple comparaison de comptage avant de passer à quelque chose de plus complexe.

À l'autre bout de l'échelle, il y a "affichez-moi les lignes de chaque table pour lesquelles il n'y a pas de ligne équivalente dans l'autre table" ou "affichez-moi où les lignes ont la même clé d'identification mais des valeurs de données différentes".

Si vous voulez réellement synchroniser la table A avec la table B, la commande MERGE peut s'avérer relativement simple.

2
David Aldridge

Solution rapide:

SELECT * FROM TABLE1
MINUS
SELECT * FROM TABLE2

Aucun enregistrement ne devrait montrer ...

1
Joan Vilariño

Si vous avez de l'argent à dépenser, utilisez l'outil PowerDIFF pour Oracle: http://www.orbit-db.com . Il comporte un certain nombre d’options de comparaison et fait très bien ce type de travail.

1
Stefan Pflanz

Essayer:

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

Avec sql Oracle 11g +

0
KingRider

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

En supposant que col1 est la colonne de clé primaire, cela donnera toutes les lignes dans table1 respectivement à la table2 colonne 1.

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

J'espère que cela t'aides

0
Kumar

Outre certaines des autres réponses fournies, si vous souhaitez examiner les différences de structure de tableau avec un tableau susceptible de présenter une structure similaire mais différente, vous pouvez le faire de plusieurs manières: 

Premier - Si vous utilisez Oracle SQL Developer, vous pouvez exécuter une description sur les deux tables pour les comparer: 

descr TABLE_NAME1
descr TABLE_NAME2

Deuxième - La première solution peut ne pas être idéale pour les tables plus volumineuses comportant beaucoup de colonnes. Si vous souhaitez uniquement connaître les différences de données entre les deux tables, utilisez l’opérateur SQL Minus, comme indiqué par plusieurs autres. 

Troisième - Si vous utilisez Oracle SQL Developer et que vous souhaitez comparer la structure de table de deux tables à l'aide de schémas différents, vous pouvez procéder comme suit: 

  1. Sélectionnez "Outils"
  2. Sélectionnez "Database Diff"
  3. Sélectionnez "Connexion source"
  4. Sélectionnez "Destination Connection"
  5. Sélectionnez les "types d'objet standard" que vous souhaitez comparer
  6. Entrez le "Nom de la table"
  7. Cliquez sur "Suivant" jusqu'à "Terminer"
  8. Cliquez sur "Terminer"
  9. REMARQUE: aux étapes 3 et 4, vous sélectionnerez les différents schémas dans lesquels existent les objets que vous souhaitez comparer.

Quatrième - Si les tables des deux tables que vous souhaitez comparer ont plusieurs colonnes, sont dans le même schéma, n'ont pas besoin de comparer plus de deux tables et ne sont pas attrayantes pour une comparaison visuelle à l'aide de la commande DESCR, vous pouvez utiliser ce qui suit: comparer les différences dans la structure du tableau: 

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