【问题标题】:Inner join with one row of another table与另一张表的一行进行内连接
【发布时间】:2015-08-16 00:54:19
【问题描述】:
**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 找到个别员工

以下查询仅返回一名员工,而不是全部:(

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)

以上抛出

ORDER BY 子句在视图、内联函数、派生中无效 表、子查询和公用表表达式,除非 TOP, 还指定了 OFFSET 或 FOR XML。

【问题讨论】:

  • 什么是recent dept
  • @GiorgiNakeuri 根据日期,员工最近工作的部门。对于emp id 1,仓库是最近的部门。 (第二个表中的 ID-3)
  • “最近的部门”是指员工工作的最近/最后一个部门吗?
  • @TechJerk 好的,我会在此基础上发布答案。

标签: sql sql-server sql-server-2012 inner-join


【解决方案1】:

您可以使用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

【讨论】:

    【解决方案2】:

    您可以使用 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

    【讨论】:

      【解决方案3】:

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

      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 子句中。

      【讨论】:

        猜你喜欢
        • 2015-02-22
        • 1970-01-01
        • 2016-01-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-08-07
        • 1970-01-01
        • 2011-09-02
        相关资源
        最近更新 更多