使用自联接比较同一表中的记录

j9per5c4  于 2021-07-29  发布在  Java
关注(0)|答案(1)|浏览(283)

我希望得到永久性的员工谁有加入日期大于经理。

WITH Employee AS(
        SELECT *
        FROM (VALUES(1, 'O1',   'Manager',      'Emp1', 2015),
                    (2, 'O1',   'Permanent',    'Emp2', 2016),
                    (3, 'O1',   'Contractor',   'Emp3', 2016),
                    (4, 'O2',   'Contractor',   'Emp4', 2015),
                    (5, 'O1',   'Permanent',    'Emp5', 2014),
                    (6, 'O1',   'Contractor',   'Emp6', 2013),
                    (7, 'O2',   'Permanent',    'Emp7', 2017),
                    (8, 'O1',   'Manager',      'Emp8', 2017),
                    (9, 'O2',   'Permanent',    'Emp9', 2019))
                    V(id, Organisation, type,Name, yearOfJoing))

这是我一直尝试的,但我没有记录。我期待欧普图特成为epmoyee,id为9,因为它的加入年份(2019年)比两位经理(2017年和2015年)都要大

select * from Employee M JOIN Employee P 
    ON M.id = P.id 
    AND M.type ='Manager' AND P.type ='Permanent'
    WHERE p.yearOfJoing > M.yearOfJoing
9o685dep

9o685dep1#

上的联接条件 id 是问题所在;这是表的主键,因此最终会查找具有不同类型和日期的单个记录。
我认为用横向连接来表示会更简单:

select e.*, m.id managerId, m.name mamagerName, m.yearOfJoining managerYearOfJoining
from employee e
cross apply (
    select m.*
    from employee m
    where 
        m.organisation = e.organisation 
        and m.type = 'Manager' 
        and m.yearOfJoining < e.yearOfJoining
) m
where e.type = 'Permanent'

db小提琴演示:

id | Organisation | type      | Name | yearOfJoining | mamagerName | managerYearOfJoining
-: | :----------- | :-------- | :--- | ------------: | :---------- | -------------------:
 2 | O1           | Permanent | Emp2 |          2016 | Emp1        |                 2015

这将检查员工与同一组织的经理的加入日期。另一方面,如果您希望员工在任何经理之后加入:

select e.*
from employee e
where 
    e.type = 'Permanent'
    and not exists (
        select 1 
        from employee m
        where m.type = 'Manager' and m.yearOfJoining >= e.yearOfJoining
    )

相关问题