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
                 );

因此,第一个只加入“付费”订单,消除不相关的订单。美好的