Другой подход заключается в использовании не существует:
Вернуть всех пользователей, которые находятся в Германии или Испании; а не те, у кого не было ID_CAT 1 транзакции. Согласованный подзапрос возвращает всех пользователей, у которых транзакция равна 1, а несуществование гарантирует, что мы получим только тех пользователей, которых нет в этом списке. Этот подход обычно работает хорошо, если вам не нужны данные из таблицы транзакций; если вам нужны данные из таблицы транзакций, предпочтительным является ответ Гордона.
SELECT u.u_id
FROM users u
WHERE u.country IN ('Germany','Spain')
and not exists (SELECT 1
FROM transactions
WHERE T.ID_CAT = 1
and t.U_ID = U.U_ID)
Я следую общему правилу: если мне нужно выбрать данные, они должны быть в предложении FROM. Если мне нужно ограничить данные, они должны быть в том месте, где они есть. Некоторые исключения применимы как к внешним соединениям; но обычно это дает мне хорошее начало.