我正在使用与此类似的数据库结构:http://dev.mysql.com/doc/employee/en/sakila-structure.html
表:员工
包含每位员工信息的表格。
+---------+----------+
| emp_no* | emp_name |
+---------+----------+
| emp1 | John |
| emp2 | Mike |
| emp3 | Rob |
| emp4 | Kim |
+---------+----------+
表:部门
表格包含有关公司各部门的信息。
+----------+-----------+
| dept_no* | dept_name |
+----------+-----------+
| 1 | Dep 1 |
| 2 | Dep 2 |
| 3 | Dep 3 |
| 4 | Dep 4 |
| 5 | Dep 5 |
+----------+-----------+
JUNCTION TABLE: emp_dept
主键:[ emp_no , from_date ]
用于跟踪员工之前或之前正在工作的部门的表。
+---------+----------+------------+------------+
| emp_no* | dept_no | from_date* | to_date |
+---------+----------+------------+------------+
| emp1 | 1 | 2010-01-01 | 2010-12-31 |
| emp2 | 2 | 2010-01-01 | 2013-10-31 |
| emp1 | 4 | 2010-12-31 | 2012-06-14 |
| emp3 | 3 | 2010-01-01 | 2011-08-14 |
| emp4 | 1 | 2010-01-01 | 2014-11-14 |
| emp2 | 5 | 2013-10-31 | 2014-11-14 |
| emp1 | 3 | 2012-06-14 | 2014-11-17 |
| emp3 | 1 | 2011-08-14 | 2013-07-20 |
| emp3 | 4 | 2013-07-20 | 2014-11-14 |
+---------+----------+------------+------------+
预期表:
¿我怎样才能将每个员工的最新记录从联汇表(emp_dept)加入到我的员工表中,并得到如下表所示的表格?
+---------+----------+--------+
| emp_no* | emp_name | dep_no |
+---------+----------+--------+
| emp1 | John | 3 |
| emp2 | Mike | 5 |
| emp3 | Rob | 4 |
| emp4 | Kim | 1 |
+---------+----------+--------+
答案 0 :(得分:0)
您可以在子查询中获取最大日期并加入它。
看起来你的emp_dept表条目中有拼写错误,emp_no与employees表不匹配。
如果员工目前正在离职,那么to_date是否为NULL?
在这种情况下,您需要在子查询中处理它。
SELECT e.emp_no, e.emp_name, ED.dept_no
FROM
(
SELECT emp_no, max(to_date) as maxDate
FROM emp_dept
group by emp_no)T
JOIN employee e
ON T.emp_no = e.emp_no
JOIN emp_dept ED
on T.maxDate = ED.t_date
AND ED.emp_no = T.emp_no
答案 1 :(得分:0)
创建一个只为每个员工提供最后一个部门的查询,然后在JOIN或CROSS APPLY中将其添加到主查询中
... tables with joins etc ...
CROSS APPLY
(
SELECT TOP 1 employee , dept_no FROM emp_dept
WHERE employee = !EMP FROM MAIN TABLE!
ORDER BY to_date DESC
) AS last_dept
在哪里!来自主表的EMP!是CROSS APPLY
之前的表中的员工价值
(到目前为止发布您的完整查询,以获得更完整的答案)
答案 2 :(得分:0)
假设emp_dept.Emp_no
是employees.Emp_no
Select * from
employees e
join emp_dept ed on e.emp_no = ed.emp_no
and from_date = (Select Max(from_date)
from emp_dept ed2 where ed2.emp_no = e.emp_no)