Oracle SQL如何查询未赢得任何比赛的玩家数据
查询无获胜记录玩家的Oracle SQL实现
表结构与需求说明
现有两张业务表,结构及测试数据如下:
Table Players Table Wins ID Name ID Player_won 1 Mick 1 2 2 Frank 2 1 3 Sarah 3 4 4 Eva 4 5 5 Joe 5 1
Players为玩家表:ID是玩家唯一标识,Name是玩家姓名Wins为获胜记录表:ID是比赛记录唯一标识,Player_won为对应场次获胜玩家的ID
需要筛选出从未赢得任何一场比赛的玩家,即ID没有在Wins表Player_won字段中出现过的玩家数据。
可直接使用的SQL方案
1. NOT EXISTS 写法(生产环境优先推荐)
Oracle对EXISTS谓词的优化非常成熟,不会出现空值导致的逻辑异常,性能稳定:
SELECT p.ID, p.Name FROM Players p WHERE NOT EXISTS ( SELECT 1 FROM Wins w WHERE w.Player_won = p.ID );
2. LEFT JOIN 写法(大数据量场景性能优异)
通过左连接关联两张表,筛选关联后获胜记录为空的记录即可,只要Wins.Player_won建了索引,执行效率很高:
SELECT p.ID, p.Name FROM Players p LEFT JOIN Wins w ON p.ID = w.Player_won WHERE w.ID IS NULL;
3. NOT IN 写法(逻辑直观,适合小数据量场景)
写法最容易理解,注意必须加Player_won IS NOT NULL的过滤条件,否则如果Wins表存在Player_won为空的记录,整个查询会返回空结果:
SELECT p.ID, p.Name FROM Players p WHERE p.ID NOT IN ( SELECT Player_won FROM Wins WHERE Player_won IS NOT NULL );
基于给出的测试数据,以上三种写法的返回结果一致:仅ID为3、姓名为Sarah的玩家从未获得过比赛胜利。
内容的提问来源于stack exchange,提问作者PIJUS_MAGNIFICUS
相关产品推荐
相关产品推荐

