首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于获取属于最近日期的值的SQL连接

用于获取属于最近日期的值的SQL连接
EN

Stack Overflow用户
提问于 2011-11-22 02:37:07
回答 3查看 5.1K关注 0票数 1

我有一张桌子

员工

代码语言:javascript
复制
emp_id, ~10 other fields
a1
b1

emp_type

代码语言:javascript
复制
emp_id, effective_date, employee_type
a1            2/1/2011        RS
a1            9/3/2011        TU
b1            3/2/2011        RS

我正在做类似这样的事情:

代码语言:javascript
复制
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条记录,但通常只有一条。大约有两万名员工。我见过一种交叉应用的解决方案,但发现它更慢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-11-22 02:50:36

我认为对子查询使用JOIN会更有效--整个结果集只计算一次,而不是每行计算一次:

代码语言:javascript
复制
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
票数 2
EN

Stack Overflow用户

发布于 2011-11-22 02:42:38

我建议创建一个只包含最新employee类型的视图:

代码语言:javascript
复制
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)

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

然后在其他地方使用它(许多报告,等等)更简单:

代码语言:javascript
复制
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
票数 3
EN

Stack Overflow用户

发布于 2011-11-22 02:42:25

我认为这是最有效的方法。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8216753

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档