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
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.
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: