web-dev-qa-db-fra.com

SQL Server - PAS DANS

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?

27
Madam Zu Zu

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]);
41
Dave Markle

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
6
Joe Stefanelli
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])
);
1
Kris Ivanov
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

1
Imtiaz

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.

0
Rebecca Chernoff

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.

0
Shan Plourde