查询表中的所有数据,仅加入联结表中的最新记录

时间:2014-11-17 18:09:31

标签: mysql sql database junction-table

我正在使用与此类似的数据库结构: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 |
+---------+----------+--------+

3 个答案:

答案 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_noemployees.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)