To zachowanie jest poprawne zgodnie ze standardami ANSI.
Jeśli niekwalifikowana nazwa kolumny nie zostanie rozwiązana w zakresie wewnętrznym, zostanie uwzględniony zakres zewnętrzny. Tak więc skutecznie wykonujesz niezamierzone skorelowane podzapytanie.
Dopóki tabela profile
zawiera co najmniej jeden wiersz, to
FROM users
WHERE user_id IN (
SELECT user_id FROM profile
)
zakończy się dopasowaniem wszystkich wierszy w users
(z wyjątkiem tych, w których users.user_id IS NULL
jako WHERE NULL IN (NULL)
nie ocenia się jako prawda). Aby uniknąć tego możliwego problemu, możesz użyć dwóch nazw części.
DELETE FROM users
WHERE user_id IN (SELECT p.user_id
FROM profile p)
Dałoby błąd