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

多表查询结果限制:如何关联薪资表获取每位球员最新薪资?

嘿,这个问题我日常写SQL时碰到过好多次,核心痛点就是直接关联薪资表会因为一个球员有多条薪资记录,导致原有的打击/投球统计数据被重复输出。要解决这个问题,关键是先筛选出每个球员的最新薪资记录,再把它关联到主查询里。下面给你两种实用的解法:

方法一:用窗口函数(推荐,适配多数现代数据库)

如果你的数据库支持窗口函数(比如PostgreSQL、MySQL 8.0+、SQL Server等),这是最清晰直观的写法。我们可以给每个球员的薪资记录按时间倒序编号,只保留编号为1的最新记录:

SELECT 
    pl.player_name, 
    pl.player_number, 
    bat.at_bats, 
    pit.era, 
    sal_latest.salary
FROM players pl
LEFT JOIN batting bat ON pl.player_id = bat.player_id
LEFT JOIN pitching pit ON pl.player_id = pit.player_id
LEFT JOIN (
    SELECT 
        player_id, 
        salary,
        -- 按球员分组,每组内按年份倒序编号,最新的薪资排第1
        ROW_NUMBER() OVER (PARTITION BY player_id ORDER BY year DESC) AS rn
    FROM salaries
) sal_latest ON pl.player_id = sal_latest.player_id AND sal_latest.rn = 1

小提示

如果薪资表不是用year来标记时间,而是用update_timestamp这类更新时间字段,只需要把ORDER BY year DESC改成ORDER BY update_timestamp DESC就行,逻辑完全一致。

方法二:子查询筛选最新年份(适配老版本数据库)

要是你用的是不支持窗口函数的老数据库(比如MySQL 5.x),可以用子查询先找出每个球员的最新薪资年份,再关联薪资表拿到对应记录:

SELECT 
    pl.player_name, 
    pl.player_number, 
    bat.at_bats, 
    pit.era, 
    sal.salary
FROM players pl
LEFT JOIN batting bat ON pl.player_id = bat.player_id
LEFT JOIN pitching pit ON pl.player_id = pit.player_id
LEFT JOIN salaries sal 
    ON pl.player_id = sal.player_id
    AND sal.year = (
        -- 子查询:获取当前球员的最新薪资年份
        SELECT MAX(year) 
        FROM salaries 
        WHERE player_id = pl.player_id
    )

这两种方法都能保证每个球员只返回一条最新薪资,同时不会破坏原有统计数据的结构~

内容的提问来源于stack exchange,提问作者Rich

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 20:58:00