与另一行的内部连接 ​​table

Inner join with one row of another table

**Table Employee** 

Id    Name
1     EmpName1
2     EmpName2
3     EmpName3

**Table EmpDeptHistory**

Id    EmpId    Dept        Date
1     1        Housing     2015-03-02
2     2        Finance     2015-01-03
3     1        WareHouse   2015-05-02
4     2        Housing     2015-02-06
5     3        WareHouse   2015-02-02
6     1        Housing     2015-05-01
7     2        Finance     2015-01-02
8     2        Housing     2015-05-04
9     2        Finance     2015-05-02
10    1        WareHouse   2015-03-08
11    1        Housing     2015-02-20

我需要找到每个员工最近工作的部门。我还需要通过传递 EmpId

来查找个别员工

以下查询 returns 只有一名员工,而不是全部 :(

SELECT e.id, edh.dept,edh.date
FROM Employee e
  inner join (select top 1 eh.empid, eh.dept, eh.date
              from EmpDeptHistory eh
              order by eh.date desc) as edh
    on e.id=edh.empid

是的,我知道前 1 名会根据日期给出 emp id,因此只显示一名员工的详细信息。我不确定如何获取所有员工最近的部门。

select e.id,edh.dept,edh.date
from employee e
  inner join EmpDeptHistory edh
    on e.id = (Select eh.empid, eh.dept, eh.date   
               from EmpDeptHistory eh
               where e.id=eh.empid
               order by eh.date desc)

以上抛出

The ORDER BY clause is invalid in views, inline functions, derived tables, subqueries, and common table expressions, unless TOP, OFFSET or FOR XML is also specified.

您可以对每个左侧行使用 CROSS APPLY 到 运行 右侧子查询一次:

SELECT e.id, edh.dept,edh.date
FROM Employee e cross apply ( select top 1 eh.empid, eh.dept, eh.date from  
EmpDeptHistory eh where eh.empid = e.id order by eh.date desc) as edh

您可以使用 CTE 和排名函数,例如 ROW_NUMBER:

WITH CTE AS
(
    SELECT e.id, edh.dept, edh.date,
           rn = ROW_NUMBER() OVER (PARTITION BY edh.EmpId ORDER BY edh.date DESC)
    FROM Employee e inner join EmpDeptHistory edh  
       on e.id = edh.empid
)
SELECT id, dept, date
FROM CTE
WHERE rn = 1

DEMO

对于每个员工的最新部门,您可以这样做:

SELECT t1.*
FROM EmpDeptHistory t1 INNER JOIN 
(
   SELECT EmpId, MAX(Date) [Date] 
   FROM EmpDeptHistory 
   GROUP BY EmpId
) AS t2 
    ON t1.EmpId = t2.EmpId AND t1.Date = t2.Date

如果需要,可以将 EmpId 放入 where 子句中。