2009-01-10 11 views

Répondre

1

Vous pouvez également utiliser une jointure externe gauche (la première vous indique où il existe une ligne dans le tableau a et non b, le deuxième vice-versa):

SELECT a.id FROM a LEFT JOIN b ON a.id = b.id WHERE b.id IS NULL 
SELECT b.id FROM b LEFT JOIN a ON b.id = a.id WHERE a.id IS NULL 
1
SELECT DISTINCT id FROM a WHERE NOT EXISTS (SELECT * FROM b WHERE a.id = b.id); 
SELECT DISTINCT id FROM b WHERE NOT EXISTS (SELECT * FROM a WHERE a.id = b.id); 
7

Aucune des réponses postées Jusqu'à présent (de BrynJ et Vadim) fait un travail très approfondi. Et faire le travail minutieux est également incroyablement difficile. Les deux réponses supposent qu'il suffit de savoir quels numéros d'identification sont présents dans chaque table. Cependant, en général, les tables ont plus d'une colonne.

Appelons les tableaux A et B.

Une question importante est « ne les deux tables ont le même schéma »? Si ce n'est pas le cas, un problème est de savoir quelles colonnes doivent être ajoutées à A et lesquelles doivent être ajoutées à B pour rendre leurs schémas identiques. Ceci est une requête de métadonnées, qui dépend du catalogue système. Les valeurs à insérer dans les colonnes ajoutées aux tables sont une question intéressante. Supposons que les tables ont réellement le même schéma, y ​​compris la même clé primaire et les mêmes dépendances fonctionnelles entre les colonnes. Supposons également qu'il existe une colonne ID (stockant un entier unique), une colonne Name (une chaîne) et une colonne RefDate de type DATE.

Table A         Table B 
ID Name   RefDate    ID Name   RefDate 
1 Frederick 2007-01-23    1 Josephine 2009-01-10 

Maintenant, que faut-il insérer, supprimer, mettre à jour à partir de chaque table pour les rendre identiques?

Je pense qu'il est juste de dire qu'il n'y a pas de réponse unique à cela sans connaître beaucoup plus de contexte. Il se peut que Frederick ait subi une chirurgie de changement de genre depuis 2007, et l'entrée dans B représente sa nouvelle identité. Ou ce pourrait être une gaffe; la base de données ne doit pas stocker ces deux enregistrements. Ou il pourrait y avoir une autre résolution. Malheureusement, les requêtes de BrynJ et Vadim indiqueraient qu'il n'y a pas de différence entre A et B, ce qui est une proposition douteuse pour moi. Incidemment, notez que la comparaison des lignes lorsque les lignes peuvent avoir des valeurs nulles est plus complexe que quand elles ne le sont pas. Par exemple, considérez les noms: comparaison

Pas NULLS:

(A.Name = B.Name) 

Avec: nulls

(A.Name = B.Name OR (A.Name IS NULL AND B.Name IS NULL)) 

Raison de plus pour éviter nulls chaque fois que vous le pouvez.

Questions connexes