пользователи, которые не покупают sql - PullRequest
0 голосов
/ 04 мая 2018

я использую oracle sql developer

У меня есть две таблицы: Пользователи

╔══════╤═════════╗
║ u_id │ country ║
╠══════╪═════════╣
║ 11   │ Germany ║
╟──────┼─────────╢
║ 22   │ Germany ║
╟──────┼─────────╢
║ 33   │ Italy   ║
╟──────┼─────────╢
║ 44   │ France  ║
╟──────┼─────────╢
║ 55   │ Spain   ║
╟──────┼─────────╢
║ 66   │ Italy   ║
╟──────┼─────────╢
║ 77   │ Italy   ║
╚══════╧═════════╝

и транзакций:

╔════╤══════╤════════╗
║ id │ u_id │ id_cat ║
╠════╪══════╪════════╣
║ A  │ 11   │ 2      ║
╟────┼──────┼────────╢
║ B  │ 22   │ 1      ║
╟────┼──────┼────────╢
║ C  │ 33   │ 2      ║
╟────┼──────┼────────╢
║ D  │ 33   │ 3      ║
╟────┼──────┼────────╢
║ E  │ 44   │ 3      ║
╟────┼──────┼────────╢
║ F  │ 55   │ 2      ║
╟────┼──────┼────────╢
║ G  │ 66   │ 1      ║
╟────┼──────┼────────╢
║ H  │ 55   │ 1      ║
╟────┼──────┼────────╢
║ I  │ 66   │ 1      ║
╟────┼──────┼────────╢
║ J  │ 77   │ 2      ║
╚════╧══════╧════════╝

Я хочу создать таблицу с пользователями, которые живут в (Германия или Испания) И НЕ покупали товар из категории 1. поэтому результат должен быть u_id = 11

я сделал код:

CREATE TABLE    
AS SELECT u.u_id
FROM users u
LEFT JOIN transactions s ON u.u_id = s.u_id 
WHERE  
(u.country = 'Germany' OR u.country ='Spain') AND
(s.id_cat != 1)
 ;

но он показывает u_id = 11 и 55

Ответы [ 2 ]

0 голосов
/ 04 мая 2018

Другой подход заключается в использовании не существует:

Вернуть всех пользователей, которые находятся в Германии или Испании; а не те, у кого не было 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. Если мне нужно ограничить данные, они должны быть в том месте, где они есть. Некоторые исключения применимы как к внешним соединениям; но обычно это дает мне хорошее начало.

0 голосов
/ 04 мая 2018

Я бы сделал это, используя group by и having:

SELECT u.u_id
FROM users u LEFT JOIN
     transactions s
     ON u.u_id = s.u_id 
WHERE  u.city IN ('Germany', 'Spain') 
GROUP BY u.u_id
HAVING SUM(CASE WHEN s.id_cat = 1 THEN 1 ELSE 0 END) = 0;

Подсчитывает количество транзакций с id_cat = 1. И затем возвращает только пользователей, где значение равно 0.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...