因此,假设您有一个查询来检索数据库中所有棒球运动员的统计信息,该数据会不断更新诸如散步,全垒打等统计信息,例如:
SELECT pl.player_name, pl.player_number, bat.at_bats, pit.era
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
现在说您还想从另一个表(例如薪水表)中提取统计信息,但是您只想提取最近的薪水,所以类似:
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
但是您只想获取每个球员的最新工资数字。您将如何结合所有这些?希望我能清楚地解释。
答案 0 :(得分:1)
SELECT pl.player_name, pl.player_number, bat.at_bats, pit.era, s.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
cross apply (select top 1 * from salaries sal where pl.player_id = sal.player_id order by
sal.SalaryDate desc) s
答案 1 :(得分:0)
我在本文档中遇到了很多有趣的代码(第6页-它是为SAS编写的,但是由于SAS使用ANSI SQL,所以该代码适用于所有SQL系统):https://support.sas.com/resources/papers/proceedings17/0930-2017.pdf
对于您的应用程序,它看起来像这样(不是肯定的,但是应该很接近):
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 (
select salary,
player_id
from salaries sal1
where salDate = (
select max(salDate)
from salaries sal2
where sal1.player_id = sal2.player_id
)
) as sal ON pl.player_id = sal.player_id
在这种情况下有点痛苦,因为您需要2个子查询来进行描述。我可能会把所有薪水都加入CTE,然后做max()自加入来选择最近的一个作为最终选择。