查询与父马(sire)同赛事参赛马匹的SQL问题排查
解决同一赛事中子马与父马的查询问题
咱们先从核心需求出发:找出所有和父马参加过同一赛事的马匹,输出子马名称、父马名称以及对应的赛事名。首先我得先假设你的表结构是赛马数据里常见的设计(要是和你的实际表结构有出入,你可以对应调整字段名就行):
horses表:存储马匹信息,字段大概是horse_id(主键)、name(马匹名称)、sire_id(父马的horse_id)races表:存储赛事信息,字段是race_id(主键)、race_name(赛事名称)race_entries表:存储马匹参赛记录,字段是entry_id(主键)、horse_id(参赛马匹ID)、race_id(参赛赛事ID)
你原来的SQL可能踩的坑
我猜你之前的SQL大概率没加父子马参加同一赛事的关联条件,或者没处理空值、重复数据,导致结果不符合预期。比如可能写出这样的错误SQL:
SELECT h1.name, h2.name, r.race_name FROM horses h1 JOIN horses h2 ON h1.sire_id = h2.horse_id JOIN race_entries re1 ON h1.horse_id = re1.horse_id JOIN race_entries re2 ON h2.horse_id = re2.horse_id JOIN races r ON re1.race_id = r.race_id
这个SQL的问题在于:它会把子马参加的所有赛事和父马参加的所有赛事做笛卡尔积,哪怕父子俩没参加过同一场赛事,也会被错误匹配出来。
修正后的SQL方案
这里给你两种可行的写法,你可以根据自己的数据量选择:
写法一:用JOIN直接关联同一赛事
SELECT DISTINCT h1.name AS 子马名称, h2.name AS 父马名称, r.race_name AS 赛事名称 FROM horses h1 INNER JOIN horses h2 ON h1.sire_id = h2.horse_id AND h1.sire_id IS NOT NULL -- 排除没有父马的无效数据 INNER JOIN race_entries re1 ON h1.horse_id = re1.horse_id INNER JOIN race_entries re2 ON h2.horse_id = re2.horse_id AND re1.race_id = re2.race_id -- 关键:确保父子马参加的是同一赛事 INNER JOIN races r ON re1.race_id = r.race_id ORDER BY r.race_name, h1.name;
这里的关键改进点:
- 加了
re1.race_id = re2.race_id,只保留父子俩参加同一场赛事的记录 - 用
h1.sire_id IS NOT NULL过滤掉没有父马的马匹 - 用
DISTINCT避免同一对父子马在同一赛事中重复出现(比如有些赛事可能允许同一匹马多次参赛)
写法二:用EXISTS子查询优化(适合大数据量)
如果你的参赛记录很多,用EXISTS的效率会更高,因为它会提前过滤掉父马没参加对应赛事的子马记录:
SELECT h1.name AS 子马名称, h2.name AS 父马名称, r.race_name AS 赛事名称 FROM horses h1 JOIN horses h2 ON h1.sire_id = h2.horse_id JOIN race_entries re1 ON h1.horse_id = re1.horse_id JOIN races r ON re1.race_id = r.race_id WHERE EXISTS ( SELECT 1 FROM race_entries re2 WHERE re2.horse_id = h2.horse_id AND re2.race_id = re1.race_id -- 检查父马是否参加了同一赛事 ) AND h1.sire_id IS NOT NULL ORDER BY r.race_name, h1.name;
额外提醒
如果你的表结构和我假设的不一样(比如父马字段叫sire而不是sire_id,或者参赛记录表的字段名不同),只要把对应的关联字段替换成你实际的字段名就行。
内容的提问来源于stack exchange,提问作者beginIT
相关产品推荐
相关产品推荐

