我的表存在递归关系和相对表的问题。我的目标是让所有担任主管的员工以及分配了未进行任何审核的员工或在3个月前完成最新审核的员工。
这里是架构:
员工
| ID | Name| BirtDate| Salary | SupervisorID |
这是具有Employee
的Supervisor
表,它也是Employee
。
评论
| ID | PerfomanceRating| Comment| ReviewDate| EmployeeID|
我想出了这种类型的查询,但是不起作用。
SELECT
(FName + ' ' + LName) AS Name, Employee.ID AS superID
FROM
Employee
WHERE
Employee.IsSupervisor = '1'
AND (SELECT COUNT(*)
FROM Employee
LEFT JOIN Review ON Employee.ID = Review.EmployeeId
WHERE Employee.SupervisorID = Employee.ID
GROUP BY ReviewDate
HAVING ReviewDate IS NULL
OR MAX(ReviewDate) < DATEADD(month, -3, GETDATE())) > 0
因此,最后,我需要EmployeeID
和Name
的主管人员,他们的员工没有进行任何审核,或者最近的审核超过三个月前进行。
有人对实现它有任何想法吗?
首先获取主管的ID,然后加入employee
以获取其名称。然后再次加入employee
,这次是让每个主管下的员工。然后加入一个查询,该查询返回每个员工的最大值ReviewDate
。最后,按主管分组并在having
子句中设置条件:
select (se.fname + ' ' + se.lname) Name, s.id superID
from (select distinct supervisorid id from employee) s
inner join employee se on se.id = s.id
inner join employee e on e.supervisorid = s.id
left join (
select employeeid, max(reviewdate) reviewdate
from review
group by employeeid
) r on r.employeeid = e.id
group by s.id, se.fname, se.lname
having count(case when coalesce(r.reviewdate, dateadd(month, -4, getdate())) < dateadd(month, -3, getdate()) then 1 end) > 0
尝试一下!
SELECT (FName + ' ' + LName) as Name, Employee.ID as superID
FROM Employee
WHERE Employee.IsSupervisor = '1'
AND (
NOT EXISTS (SELECT NULL
FROM Review
WHERE Employee.ID = Review.EmployeeId)
OR EXISTS (SELECT NULL
FROM Review
WHERE Employee.ID = Review.EmployeeId
GROUP BY Review.EmployeeId
HAVING MAX(ReviewDate) < DATEADD(MONTH, -3, GETDATE())
)
)
#Mike Bashkatov:IF IsSupervisor列在Employee表中可用,然后根据我的理解,以下查询将为您提供所需的输出。
SELECT (FName + ' ' + LName) as Name, Employee.ID as superID FROM Employee OEMP
WHERE Employee.IsSupervisor = '1' AND
EXISTS
(SELECT 1 FROM Employee INNER JOIN Review ON Employee.ID = Review.EmployeeId
WHERE Employee.SupervisorID = OEMP.ID
GROUP BY ReviewDate
HAVING MAX(ISNULL(ReviewDate,'01-01-1900')) < DATEADD(month, -3, GETDATE()))
怎么样:
select (FName + ' ' + LName) as Name, Employee.ID as superID
from employee supervisor
where
(select count(ID)
from employee
left join Review on review.EmployeeID = Employee.ID and ReviewDate > DATEADD(month, -3, GETDATE()) --only join reviews that were in the past 3 months
where employee.supervisorID = supervisor.ID
and Review.ID is null ) > 0) > 0
[基本上,它使拥有子雇员的所有雇员以及子雇员成为过去三个月中仅接受过审核的雇员。然后它将筛选出所有加入评论的子雇员。