PostgreSQL查询指定用户未出价的所有拍卖记录SQL写法
PostgreSQL查询指定用户未提交出价的拍卖记录方案
基础表结构说明
Auction(拍卖表)- 主键:
auction_id - 字段:
auction_id(PK)、auction_data - 示例数据:共3条拍卖记录,
auction_id对应为A1、A2、A3
- 主键:
Bids(出价表)- 主键:
bid_id - 外键:
auction_id关联Auction表的auction_id字段 - 字段:
bid_id(PK)、auction_id(FK)、user_id、bid_price - 业务规则:单个用户对单场拍卖仅可提交1次出价
- 验证场景:查询用户U1未出价的拍卖时,预期返回结果为
auction_id=A3
- 主键:
最优实现写法
最简洁直观、性能也最好的写法是使用NOT EXISTS谓词,语义和需求完全匹配:判断拍卖表中不存在「当前拍卖+指定用户」对应的出价记录即可,写法如下:
SELECT a.auction_id, a.auction_data FROM Auction a WHERE NOT EXISTS ( SELECT 1 FROM Bids b WHERE b.auction_id = a.auction_id AND b.user_id = 'U1' -- 替换为实际需要查询的目标用户ID );
其他可选写法
如果习惯关联查询写法,也可以用左外连接+空值判断的反连接逻辑实现,返回结果和上述写法一致:
SELECT a.auction_id, a.auction_data FROM Auction a LEFT JOIN Bids b ON a.auction_id = b.auction_id AND b.user_id = 'U1' -- 注意用户ID过滤条件要写在JOIN子句中,不能写在WHERE里 WHERE b.bid_id IS NULL;
注意:不推荐使用
NOT IN写法实现该需求,一旦Bids表中关联字段出现空值,会导致整个查询结果异常,且查询性能弱于上述两种方案。
内容的提问来源于stack exchange,提问作者Vegan Vegeta
相关产品推荐
相关产品推荐

