多表查询结果限制:如何关联薪资表获取每位球员最新薪资?
嘿,这个问题我日常写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
相关产品推荐
相关产品推荐

