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?
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.
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
.
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
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.
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.
Solution rapide:
SELECT * FROM TABLE1
MINUS
SELECT * FROM TABLE2
Aucun enregistrement ne devrait montrer ...
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.
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 +
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
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:
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;