web-dev-qa-db-fra.com

sélectionner une valeur là où elle n'existe pas dans une autre table

J'ai deux tables

Tableau A:

ID
1
2
3
4

Tableau B:

ID
1
2
3

J'ai deux demandes:

  • Je veux sélectionner toutes les lignes du tableau A que le tableau B ne possède pas, qui dans ce cas est la ligne 4.
  • Je souhaite supprimer toutes les lignes que la table B ne possède pas.

J'utilise SQL Server 2000.

50
Wai Wong

Vous pouvez utiliser NOT IN:

SELECT A.* FROM A WHERE ID NOT IN(SELECT ID FROM B)

Cependant, en attendant, je préfère NOT EXISTS:

SELECT A.* FROM A WHERE NOT EXISTS(SELECT 1 FROM B WHERE B.ID=A.ID)

Il existe également d'autres options, cet article explique très bien tous les avantages et inconvénients:

Dois-je utiliser NOT IN, OUTER APPLY, LEFT OUTER JOIN, EXCEPT ou NOT EXISTS?

86
Tim Schmelter

Pour votre première question, il existe au moins trois méthodes courantes:

  • N'EXISTE PAS
  • PAS DEDANS
  • JOINT GAUCHE

Le SQL ressemble à ceci:

SELECT * FROM TableA WHERE NOT EXISTS (
    SELECT NULL
    FROM TableB
    WHERE TableB.ID = TableA.ID
)

SELECT * FROM TableA WHERE ID NOT IN (
    SELECT ID FROM TableB
)

SELECT TableA.* FROM TableA 
LEFT JOIN TableB
ON TableA.ID = TableB.ID
WHERE TableB.ID IS NULL

Selon la base de données que vous utilisez, les performances de chacune peuvent varier. Pour SQL Server (colonnes non nullables):

Les prédicats NOT EXISTS et NOT IN sont le meilleur moyen de rechercher des valeurs manquantes, tant que les deux colonnes en question ne sont PAS NULES.

26
Mark Byers

Cela sélectionnerait 4 dans votre cas

SELECT ID FROM TableA WHERE ID NOT IN (SELECT ID FROM TableB)

Cela les supprimerait

DELETE FROM TableA WHERE ID NOT IN (SELECT ID FROM TableB)
3
kamasheto
select ID from A where ID not in (select ID from B);

ou

select ID from A except select ID from B;

Votre deuxième question:

delete from A where ID not in (select ID from B);
2
Behrang
SELECT ID 
  FROM A 
 WHERE NOT EXISTS( SELECT 1
                     FROM B
                    WHERE B.ID = A.ID
                 )
1
Mark Baker