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