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

查询与父马(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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 03:41:18