J'essaie de comparer deux tables, SQL Server, pour vérifier certaines données. Je veux renvoyer toutes les lignes des deux tables où les données se trouvent dans l'une ou l'autre. En substance, je veux montrer toutes les divergences. Je dois vérifier trois éléments de données, FirstName, LastName et Product.
Je suis assez nouveau dans SQL et il semble que la plupart des solutions que je trouve consistent à compliquer les choses. Je n'ai pas à me soucier des NULL.
J'ai commencé par essayer quelque chose comme ça:
SELECT DISTINCT [First Name], [Last Name], [Product Name] FROM [Temp Test Data]
WHERE ([First Name] NOT IN (SELECT [First Name]
FROM [Real Data]))
J'ai du mal à aller plus loin.
Merci!
ÉDITER:
Sur la base de la réponse de @treaschf, j'ai essayé d'utiliser une variante de la requête suivante:
SELECT td.[First Name], td.[Last Name], td.[Product Name]
FROM [Temp Test Data] td FULL OUTER JOIN [Data] AS d
ON td.[First Name] = d.[First Name] AND td.[Last Name] = d.[Last Name]
WHERE (d.[First Name] = NULL) AND (d.[Last Name] = NULL)
Mais je continue à obtenir 0 résultat, quand je sais qu'il y a au moins 1 ligne dans td qui n'est pas dans d.
ÉDITER:
Ok, je pense que je l'ai compris. Au moins pendant mes quelques minutes de test, cela semble fonctionner assez bien.
SELECT [First Name], [Last Name]
FROM [Temp Test Data] AS td
WHERE (NOT EXISTS
(SELECT [First Name], [Last Name]
FROM [Data] AS d
WHERE ([First Name] = td.[First Name]) OR ([Last Name] = td.[Last Name])))
Cela va essentiellement me dire ce qui est dans mes données de test qui ne l' est pas dans mes données réelles. Ce qui convient parfaitement à ce que je dois faire.
Réponses:
SI vous avez des tableaux
A
etB
, tous les deux avec columC
, voici les enregistrements, qui sont présents dans le tableauA
mais pas dansB
:Pour obtenir toutes les différences avec une seule requête, une jointure complète doit être utilisée, comme ceci:
Ce que vous devez savoir dans ce cas, c'est que lorsqu'un enregistrement peut être trouvé dans
A
, mais pas dansB
, les colonnes qui viennentB
seront NULL, et de même pour celles qui sont présentes dansB
et non dansA
, les colonnes deA
will être nul.la source
The objects "a.dbo.student" and "b.dbo.student" in the FROM clause have the same exposed names. Use correlation names to distinguish them.
Je reçois une erreur si les noms de table sont identiques et que vous les tirez de deux bases de données différentes.a.dbo.student as
etb.dbo.student bs
ensuite vous référer aux tables avecas
etbs
la source
SELECT *
fonctionne si c'est le cas pour toutes les colonnes; sinon, sélectionnez simplement un sous-ensemble.Je sais que ce n'est peut-être pas une réponse populaire, mais je suis d'accord avec @Randy Minder sur l'utilisation d'un outil tiers lorsqu'une comparaison plus complexe est nécessaire.
Ce cas spécifique ici est facile et pour ce cas de tels outils ne sont pas nécessaires mais cela peut devenir complexe facilement si vous introduisez plus de colonnes, de bases de données sur deux serveurs, des critères de comparaison plus complexes et autres.
Il existe de nombreux outils tels que ApexSQL Data Diff ou Quest Toad et vous pouvez toujours les utiliser en mode d'essai pour faire le travail.
la source
tablediff
utilitaire de ligne de commande SQL Server mentionné ici .Pour obtenir toutes les différences entre deux tables, vous pouvez utiliser comme moi cette requête SQL:
la source
Variation simple sur la réponse @erikkallen qui montre dans quelle table la ligne est présente:
Si vous obtenez une erreur
alors il peut être utile d'ajouter
la source
All queries combined using a UNION, INTERSECT or EXCEPT operator must have an equal number of expressions in their target lists.
avec cette sélection. J'ai également dû ajouter la'table1' as source,
partie à la partie Except. - J'ai édité la réponse pour cela.Si vous souhaitez obtenir les valeurs de colonne différentes, vous pouvez utiliser le modèle Entity-Attribute-Value:
EXEMPLE DE FIDDLE SQL
la source
Essaye ça :
Beaucoup plus simple à lire.
la source
Cela fera l'affaire, similaire à la solution de Tiago , retourne également la table "source".
Le résultat contiendra des différences entre les tables, dans la colonne _tabloc vous aurez la référence de la table.
la source
Présentation de la Cadillac of Diffs en tant que SP. Voir à l'intérieur pour le modèle de base basé sur la réponse de @erikkallen. Elle supporte
Usage:
Code:
la source
Vous pouvez utiliser sauf, par exemple quelque chose comme ceci:
la source
Pour un test de fumée simple où vous essayez de vous assurer que deux tableaux correspondent sans se soucier des noms de colonne:
Vous pouvez facilement écrire une procédure de stockage pour comparer un lot de tableaux.
la source
Il existe un problème de performances lié à la jointure gauche ainsi qu'à la jointure complète avec des données volumineuses.
À mon avis, c'est la meilleure solution:
la source