Sql 如何选择非付费用户?
我想选择没有任何订单或没有任何“付费”订单的用户:Sql 如何选择非付费用户?,sql,postgresql,Sql,Postgresql,我想选择没有任何订单或没有任何“付费”订单的用户: SELECT "users".* FROM "users" LEFT OUTER JOIN orders ON orders.user_id=users.id WHERE (NOT (orders.state = 'paid')) 这将只返回尚未支付订单的用户,而忽略没有订单的用户 我该如何纠正这一点?以下是逻辑: SELECT u.* FROM "users" u LEFT JOIN orders o ON o.u
SELECT "users".*
FROM "users"
LEFT OUTER JOIN orders ON orders.user_id=users.id
WHERE (NOT (orders.state = 'paid'))
这将只返回尚未支付订单的用户,而忽略没有订单的用户
我该如何纠正这一点?以下是逻辑:
SELECT u.*
FROM "users" u LEFT JOIN
orders o
ON o.user_id = u.id AND o.state = 'paid' -- match on "paid"
WHERE o.user_id IS NULL; -- return without a match
使用NOT EXISTS
可能更好地理解这一点:
SELECT u.*
FROM "users" u
WHERE NOT EXISTS (SELECT 1 -- the following does not exist
FROM orders o
WHERE o.user_id = u.id AND -- match on the user
o.state = 'paid' -- match paid state
);
因此,第一个只加入“付费”订单,消除不相关的订单。美好的