La forma más sencilla es con not exists
o left join
:
select u.*
from users u left join
addresses a
on a.username = u.username and
a.city = 'Peoria'
where a.city is null;
La left join
mantiene todos los registros en usuarios y cualquier registro en addresses
que coincidan con on
condiciones. En este caso (porque el nombre de la ciudad está en on
condición), devuelve a todos los usuarios con información sobre las ciudades o NULL
valores. El where
cláusula elige el NULL
valores -- los que no coinciden.
El not exists
podría ser más fácil de seguir:
select u.*
from users u
where not exists (select 1
from addresses a
where a.username = u.username and
a.city = 'Peoria'
);