不买sql的用户

时间:2018-05-03 22:34:42

标签: sql oracle

我正在使用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 :(得分:4)

我会使用group byhaving

执行此操作
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的用户。

答案 1 :(得分:2)

另一种方法是使用不存在:

返回德国或西班牙的所有用户;而不是那些没有ID_CAT 1交易的人。 coorlated子查询返回事务为1的所有用户,而not exists确保我们只获取那些不在该列表中的用户。如果您不需要来自事务表的数据,这种方法通常很有效。如果您需要交易表中的数据,则首选Gordon的回复。

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子句中。如果我需要限制数据,它应该在哪里或有。一些例外适用于外连接;但它通常给我一个很好的起点。