具有子查询的递归关系和相对表查询

问题描述 投票:0回答:4

我的表存在递归关系和相对表的问题。我的目标是让所有担任主管的员工以及分配了未进行任何审核的员工或在3个月前完成最新审核的员工。

这里是架构:

员工

| ID | Name| BirtDate| Salary | SupervisorID |

这是具有EmployeeSupervisor表,它也是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

因此,最后,我需要EmployeeIDName的主管人员,他们的员工没有进行任何审核,或者最近的审核超过三个月前进行。

有人对实现它有任何想法吗?

sql sql-server
4个回答
0
投票

首先获取主管的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

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())
                )
)

0
投票

#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()))

0
投票

怎么样:

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

[基本上,它使拥有子雇员的所有雇员以及子雇员成为过去三个月中仅接受过审核的雇员。然后它将筛选出所有加入评论的子雇员。

© www.soinside.com 2019 - 2024. All rights reserved.