我正在使用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
答案 0 :(得分:4)
我会使用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的用户。
答案 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子句中。如果我需要限制数据,它应该在哪里或有。一些例外适用于外连接;但它通常给我一个很好的起点。