【问题标题】:SQL Join to get value belong with most recent dateSQL Join 以获取属于最近日期的值
【发布时间】:2011-11-21 18:37:06
【问题描述】:

我有一张桌子

员工

emp_id, ~10 other fields
a1
b1

emp_type

emp_id, effective_date, employee_type
a1            2/1/2011        RS
a1            9/3/2011        TU
b1            3/2/2011        RS

我正在做这样的事情:

select emp_id, ~10 other fields, employee_type
from employee e
inner join emp_type et
   on et.emp_id = e.emp_id
      and effective_date = (select max(effective_date) 
                            from emp_type et2 
                            where et2.emp_id = et.emp_id)

这是最有效的方法吗?它运行速度不会太慢,但它是报告中非常常见的查询,我希望有最有效的方法。 emp_type 每个员工最多有 4-5 条记录,但通常只有一条。大约有20,000名员工。我见过一个交叉应用解决方案,但发现速度较慢。

【问题讨论】:

  • 您使用的是什么 RDBMS/版本?

标签: sql sql-server-2008 performance


【解决方案1】:

我建议创建一个仅包含最新员工类型的视图:

CREATE VIEW active_emp_type
AS
Select a.emp_id, a.effective_date, a.employee_type
from emp_type a
where a.effective_date = (select max(effective_date) from emp_type 
                          where emp_id = a.emp_id)

(或获取相同结果视图数据的另一种方法)

然后在其他地方(大量报告等)使用它更容易:

select e.emp_id, ~10 other fields, t.employee_type
from employee e
join active_emp_type t on e.emp_id = t.emp_id

【讨论】:

    【解决方案2】:

    我认为子查询上的JOIN 会更有效 - 整个结果集计算一次而不是每行一次:

    select emp_id, ~10 other fields, employee_type
    from employee e
    inner join emp_type et
       on et.emp_id = e.emp_id
    Inner join (SELECT emp_id, MAX(effective_date) effective_date
                FROM Emp_type et2
                GROUP BY Emp_id) SubQ
    ON SubQ.emp_id = et.emp_id
    AND SubQ.effective_date = et.effective_date
    

    【讨论】:

    • 谢谢,我试过了,两者的执行计划一样。我认为在其他情况下,这会更快,所以我想我会创建一个视图并使用它。
    【解决方案3】:

    认为这是最有效的方法。

    请不要忘记在连接字段和日期时间字段上放置索引。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-07
      • 2017-03-03
      • 1970-01-01
      • 1970-01-01
      • 2019-05-31
      • 1970-01-01
      • 2019-12-10
      • 1970-01-01
      相关资源
      最近更新 更多