SQL: возвращает только записи без каких-либо ассоциаций, соответствующих критериям

Как я могу вернуть только записи, у которых нет связанных записей, соответствующих определенным критериям?

Например, если у меня есть отношения между пользователями и адресами от одного до многих, как я могу получить всех пользователей, которые не имеют определенного города в своей истории адресов?

SQL Fiddle здесь

Примеры данных здесь:

CREATE TABLE Users (`id` int, `name` varchar(20)) ; CREATE TABLE Addresses (`id` int, `city` varchar(20),`user_name` varchar(20)) ; INSERT INTO Users (`id`, `name`) VALUES (1, 'sarah'), (2, 'harry'), ; INSERT INTO Addresses (`id`, `city`, `user_name`) VALUES (1, 'denver', 'sarah'), (2, 'anchorage', 'sarah'), (3, 'providence', 'harry'), (4, 'new york', 'harry') ; 

Самый простой способ – not exists или 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; 

left join сохраняет все записи в пользователях и любые записи в addresses которые соответствуют условиям. В этом случае (поскольку имя города находится в состоянии), он возвращает всех пользователей либо информацию о городах, либо значения NULL . Предложение where выбирает значения NULL – несоответствующие.

Эквивалент not exists может быть проще:

 select u.* from users u where not exists (select 1 from addresses a where a.username = u.username and a.city = 'Peoria' );