多表选择,限制结果数

时间:2020-06-09 15:56:50

标签: sql

因此,假设您有一个查询来检索数据库中所有棒球运动员的统计信息,该数据会不断更新诸如散步,全垒打等统计信息,例如:

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

但是您只想获取每个球员的最新工资数字。您将如何结合所有这些?希望我能清楚地解释。

2 个答案:

答案 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()自加入来选择最近的一个作为最终选择。