J'ai besoin de créer une requête qui me montrera les enregistrements qui se trouvent dans le tableau 1, mais qui ne le sont pas dans le tableau 2, en fonction de la combinaison make-model-serial number.
Je sais pertinemment qu'il y a 4 enregistrements qui diffèrent, mais ma requête revient toujours vide.
SELECT *
FROM Table1 WHERE MAKE+MODEL+[Serial Number] NOT IN
(SELECT make+model+[serial number] FROM Table2)
Le tableau 1 contient 5 enregistrements.
Lorsque je change la requête en IN
, j'obtiens 1 enregistrement. Que fais-je de mal avec le NOT
?
C'est à cause de la façon dont NOT IN fonctionne .
Pour éviter ces maux de tête (et pour une requête plus rapide dans de nombreux cas), je préfère toujours PAS EXISTE:
SELECT *
FROM Table1 t1
WHERE NOT EXISTS (
SELECT *
FROM Table2 t2
WHERE t1.MAKE = t2.MAKE
AND t1.MODEL = t2.MODEL
AND t1.[Serial Number] = t2.[serial number]);
Vous feriez probablement mieux de comparer les champs individuellement, plutôt que de concaténer les chaînes.
SELECT t1.*
FROM Table1 t1
LEFT JOIN Table2 t2
ON t1.MAKE = t2.MAKE
AND t1.MODEL = t2.MODEL
AND t1.[serial number] = t2.[serial number]
WHERE t2.MAKE IS NULL
SELECT [T1].*
FROM [Table1] AS [T1]
WHERE NOT EXISTS (SELECT
1 AS [C1]
FROM [Table2] AS [T2]
WHERE ([T2].[MAKE] = [T1].[MAKE]) AND
([T2].[MODEL] = [T1].[MODEL]) AND
([T2].[Serial Number] = [T1].[Serial Number])
);
SELECT * FROM Table1
WHERE MAKE+MODEL+[Serial Number] not in
(select make+model+[serial number] from Table2
WHERE make+model+[serial number] IS NOT NULL)
Cela a fonctionné pour moi, où make+model+[serial number]
était un nom de champ
Utilisez une jointure gauche en vérifiant le côté droit pour les valeurs nulles.
SELECT a.Id
FROM TableA a
LEFT JOIN TableB on a.Id = b.Id
WHERE b.Id IS NULL
Ce qui précède correspondrait à TableA et TableB en fonction de la colonne Id dans chacune, puis vous donnerait les lignes où le côté B est vide.
Un problème pourrait être que si la marque, le modèle ou le [numéro de série] étaient nuls, les valeurs ne seraient jamais renvoyées. Parce que les concaténations de chaînes avec des valeurs nulles aboutissent toujours à null, et non à () avec null ne retournera toujours rien. Le remède à cela est d'utiliser un opérateur tel que IsNull (make, '') + IsNull (Model, ''), etc.