SQL:同时拥有多个部门的员工

时间:2016-04-13 09:00:17

标签: sql oracle

我需要一个查询,为同时在多个部门注册的员工返回angular.element(document.body).injector().get('$location').search("f",null),这意味着:

Employee1可以在

中工作
Employee ID, Department, Begin date, End date

(日期重叠)

OR

department A: from 01.01.2015 to 31.12.2015 and
department B: from 01.01.2015 to 31.12.2015 

(日期部分重叠)

我的桌子是这样的

department A from 01.01.2015 to 31.12.2015 and 
department B from 01.06.2015 to 31.12.2018

此表包含的数据仅为ID。 结果应该是这样的:

Employee (Employee ID)
Career (Employee ID, Department ID, BeginDate, EndDate)
Department (DepartmentID)

目前的部门栏目是ID(12HDGH4376SHFJ48)。

我不确定如何编写此查询。我不确定在where子句中使用什么,或者它是否需要子查询等。我对此有点失落。我也在研究Oracle。谢谢你的任何建议。

2 个答案:

答案 0 :(得分:0)

您使用的是Oracle,Mysql等吗?

你也在查询3张桌子吗?

根据您的使用情况,您应使用排名来识别最新记录或当前为此人激活的记录。

    Select
    RANK() OVER (partition by Employee ID BY ORDER BY NVL(END_DATE, CURRENT_DATE)DESC) AS RANK.

等级值将为您提供最新记录。如果你然后子查询整个事情你可以有一个像这样的where子句。     其中a.rank = 1 a是子查询的别名。

答案 1 :(得分:0)

你可以尝试这样的事情:

<强>设置:

create table Employee(EmployeeID number);
create table career(EmployeeID number, DepartmentID number, BeginDate date, EndDate date);
create table department(DepartmentID number, department varchar2(16));
insert into department values (1, 'HR');
insert into department values (2, 'IT');
insert into employee values (20);
insert into employee values (10);
insert into career values (10, 1, to_date('01.01.2015', 'dd.mm.yyyy'), to_date('31.12.2015', 'dd.mm.yyyy'));
insert into career values (10, 2, to_date('01.01.2015', 'dd.mm.yyyy'), to_date('31.12.2015', 'dd.mm.yyyy'));
insert into career values (20, 1, to_date('01.01.2015', 'dd.mm.yyyy'), to_date('31.12.2015', 'dd.mm.yyyy'));
insert into career values (20, 2, to_date('01.06.2015', 'dd.mm.yyyy'), to_date('31.12.2018', 'dd.mm.yyyy'));

<强>查询:

select employeeId, departmentId, beginDate, endDate
from (
      select employeeId, departmentId, beginDate, endDate,
             lag(endDate) over (partition by employeeId order by beginDate) as previousEndDate,
             lead(beginDate) over (partition by employeeId order by beginDate) as nextBeginDate
      from career
         inner join department
           using(departmentId)
     )
where previousEndDate between beginDate and endDate OR
      nextBeginDate between beginDate and endDate

按日期对行进行排序,并检查每一行,如果它与前一行或下一行重叠,则为同一员工