2014-04-23 4 views
1

Mon manager m'a demandé de rédiger un rapport pour comparer les noms de colonnes des deux tableaux suivants:Utilisation de SQL pour comparer les tables

  • UK Personnel
  • USA Personnel

Alors, il est pas à la recherche de toutes les données dans les tableaux, juste un morceau de SQL que nous pouvons exécuter pour vérifier les noms de colonnes et montrer les colonnes dont le nom ne figure pas dans les deux bases de données. Un morceau de code SQL ou une procédure stockée serait bien.

Je ne suis qu'un DBA depuis quelques mois, et je ne sais pas par où commencer.

Toute aide serait grandement appréciée.

+1

Quels SGBD utilisez-vous? Postgres? Oracle? –

+0

Im utilisant Oracle, désolé j'ai oublié de l'inclure. – user3481395

+0

Mon manager l'a appelé un "rapport" quelconque. – user3481395

Répondre

1

La table/vue qui contient les informations de métadonnées dans Oracle est all_tab_cols.

Voici un exemple de la façon dont vous pouvez comparer les colonnes dans les deux:

select column_name, 
     (case when max(case when table_name = 'table1' then 1 else 0 end) = 0 
      then 'InTable2' 
      when max(case when table_name = 'table2' then 1 else 0 end) = 0 
      then 'InTable1' 
      else 'InBoth' 
     end) as which 
from all_tab_cols 
where table_name in ('table1', 'table2') 
group by column_name; 
+0

Merci beaucoup, c'est beaucoup d'aide. Je comprends maintenant la structure dans laquelle je peux écrire cette requête, et des requêtes similaires. – user3481395

2

En tant que point de départ, vous pouvez faire une jointure externe complète de deux sous-requêtes contre all_tab_columns ou user_tab_columns si vous possédez les deux :

select usa.column_name as usa_column, uk.column_name as uk_column 
from (
    select column_name from all_tab_columns 
    where table_name = '<USA_TABLE_NAME>' 
) usa 
full outer join (
    select column_name from all_tab_columns 
    where table_name = '<UK_TABLE_NAME>' 
) uk 
on uk.column_name = usa.column_name 
order by nvl(usa.column_name, uk.column_name), uk.column_name; 

Affiche les colonnes qui apparaissent dans les deux. Pour masquer les ajouter simplement:

where usa.column_name is null or uk.column_name is null 

... avant la order by.

SQL Fiddle demo. (Ou with Gordon's approach pour le même exemple).

Bien sûr, vous pouvez ensuite construire sur cela pour présenter les différences comme bon vous semble.

+0

Merci beaucoup, c'est incroyable, Dans mon esprit, j'ai juste une requête simple sélection distincte à l'esprit. C'est parfait. – user3481395