2017-04-05 123 views
0

我想知道是否有人可以提供帮助。AdventureWorks2014 - 根据职位标题创建最新的员工摘录

我想写一些代码,返回使用Adventureworks2012数据库的基于Jobtitle的最新雇员列表。

到目前为止,我有以下几点:

SELECT DISTINCT HREDH.BusinessEntityID, 
    HRE.JobTitle, 
    hre.HireDate 
FROM [HumanResources].[EmployeeDepartmentHistory] HREDH 
INNER JOIN HumanResources.Employee HRE ON HREDH.BusinessEntityID = HRE.BusinessEntityID 
    AND hre.BusinessEntityID = (
     SELECT TOP 1 BusinessEntityID 
     FROM HumanResources.Employee hre2 
     WHERE hre2.JobTitle = hre.JobTitle 
     ORDER BY HireDate DESC 
     ) 
ORDER BY HRE.JobTitle 

这似乎很好地工作,但我相信有一个更好的办法做到这一点(没有在声明的开头使用SELECT DISTINCT的)

我正在尽我所能,自己学习SQL,所以从这里的大量知识库的任何帮助将不胜感激!

感谢,

+0

你为什么很确定呢? – LONG

回答

0

这将返回从连接两个表的所有行的职位录用日期是等于该职位最高的日期。

SELECT 
    HREDH.BusinessEntityID 
    ,HRE.JobTitle 
    ,hre.HireDate 
FROM [HumanResources].[EmployeeDepartmentHistory] AS HREDH 
    JOIN HumanResources.Employee AS HRE 
     ON HREDH.BusinessEntityID = HRE.BusinessEntityID 
WHERE HRE.HireDate = (SELECT MAX(HireDate) FROM HumanResources.Employee AS _HRE WHERE HRE.JobTitle = _HRE.JobTitile) 
ORDER BY HRE.JobTitle 
+0

谢谢安东尼! 这似乎做了大部分的工作,但它仍然返回重复的记录,当我执行查询。这就是为什么我必须在查询中使用DISTINCT语句的原因。你知道一个替代方法来删除重复? – Rosscoasks

+0

没有下载和安装AdventureWorks数据库,我的猜测是在同一天有多个人被雇用同一份工作。如果是这样,那么使用不同的是正确的,因为这些不是重复的返回,你只是不感兴趣多次看到数据。或者,如果您可以在Employee表上提供主键的名称,我可以编辑我的代码,以获取以最高主键值确定的最近雇员的其他方式。 –