Sélectionnez NOT IN multiple columns

Je dois 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 écrire cette requête

Je ne sais pas si vous pensez à:

 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 associé à id1 et id2 avec id2 pas les deux.

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

Soyez conscient des pièges avec NOT IN , cependant, lorsque vous impliquez des valeurs NULL :

  • Trouver des enregistrements où la jointure n’existe pas

Variante avec JOIN GAUCHE:

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

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

  • Sélectionnez les lignes qui ne sont pas présentes dans une autre table

Vous devriez probablement utiliser NOT EXISTS pour plusieurs colonnes.