You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.31 06:19:28