web-dev-qa-db-fra.com

Sélectionnez NOT IN plusieurs colonnes

J'ai besoin d'implémenter la requête suivante

SELECT * 
FROM   friend 
WHERE  ( friend.id1, friend.id2 ) 
         NOT IN (SELECT id1, 
                        id2 
                 FROM   likes) 

mais NOT IN ne peut pas être implémenté sur plusieurs colonnes. Comment puis-je écrire cette requête

60
Gunjan Nigam

Je ne sais pas si tu penses à:

select * from friend f
where not exists (
    select 1 from likes l where f.id1 = l.id and f.id2 = l.id2
)

cela ne fonctionne que si id1 est lié à id1 et id2 à id2 pas les deux.

86
Michał Powaga

Un autre SGBDR mystérieusement inconnu. Votre syntaxe est parfaitement correcte dans PostgreSQL. D'autres styles de requête peuvent être plus rapides (notamment le NOT EXISTS variante ou un LEFT JOIN), mais votre requête est parfaitement légitime.

Soyez conscient des pièges avec NOT IN, cependant, lorsqu’il implique des valeurs NULL:

Variante avec LEFT JOIN:

SELECT *
FROM   friend f
LEFT   JOIN likes l USING (id1, id2)
WHERE  l.id1 IS NULL;

Voir la réponse de @ Michał pour le NOT EXISTS une variante.
Une évaluation plus détaillée de quatre variantes de base:

18