J'ai deux tables
Tableau A:
ID
1
2
3
4
Tableau B:
ID
1
2
3
J'ai deux demandes:
J'utilise SQL Server 2000.
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?
Pour votre première question, il existe au moins trois méthodes courantes:
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.
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)
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);
SELECT ID
FROM A
WHERE NOT EXISTS( SELECT 1
FROM B
WHERE B.ID = A.ID
)