PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Instrução IN do Postgresql


Esse comportamento está correto de acordo com os padrões ANSI.

Se o nome de coluna não qualificado não for resolvido no escopo interno, o escopo externo será considerado. Então, efetivamente, você está fazendo uma subconsulta correlacionada não intencional.

Desde que a tabela profile contém pelo menos uma linha então
 FROM users
 WHERE user_id IN (
        SELECT user_id FROM profile
        )

acabará correspondendo a todas as linhas em users (exceto onde users.user_id IS NULL como WHERE NULL IN (NULL) não avalia como verdadeiro). Para evitar esse possível problema, você pode usar dois nomes de partes.
DELETE FROM users
WHERE  user_id IN (SELECT p.user_id
                   FROM   profile p) 

Daria o erro