查询表中的所有数据,仅连接联结表中的最新记录
Posted
技术标签:
【中文标题】查询表中的所有数据,仅连接联结表中的最新记录【英文标题】:Querying all data from a table joining ONLY the latest record from a junction table 【发布时间】:2014-11-17 18:09:30 【问题描述】:我正在使用与此类似的数据库结构: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 |
+----------+-----------+
联结表: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 |
+---------+----------+--------+
【问题讨论】:
Employees 表中的emp_no
与emp_dept
表中的emp_no
不同。你应该如何链接这两个表
ups... 我刚刚更正了表格。感谢您的观察
【参考方案1】:
假设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)
【讨论】:
【参考方案2】:创建一个只为每个员工提供最后一个部门的查询,然后将其添加到您的主查询中的 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
之前表格中的员工值
(发布您到目前为止的完整查询,以获得更完整的答案)
【讨论】:
【参考方案3】:您可以在子查询中获取最大日期并加入它。
您在 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
【讨论】:
你需要在派生表中分组 我收到此错误消息:错误代码:1054。“on 子句”中的未知列“ED.maxDate” @swordf1zh,应该是T.maxDate,现在可以试试吗? @RADAR 现在可以工作了,但是使用这种方法来包含来自多个联结表的数据更加复杂。我正在使用另一组类似的表来管理“角色”,并且还希望在结果表中包含角色信息。以上是关于查询表中的所有数据,仅连接联结表中的最新记录的主要内容,如果未能解决你的问题,请参考以下文章