PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Instruction Postgresql IN

Ce comportement est conforme aux normes ANSI.

Si le nom de colonne non qualifié ne se résout pas dans la portée interne, la portée externe sera prise en compte. Donc, effectivement, vous faites une sous-requête corrélée non intentionnelle.

Tant que la table profile contient au moins une ligne alors

 FROM users
 WHERE user_id IN (
        SELECT user_id FROM profile
        )

finira par correspondre à toutes les lignes dans users (sauf où users.user_id IS NULL comme WHERE NULL IN (NULL) n'est pas évalué à vrai). Pour éviter ce problème possible, vous pouvez utiliser deux noms de partie.

DELETE FROM users
WHERE  user_id IN (SELECT p.user_id
                   FROM   profile p) 

Donnerait l'erreur