Sql 如何在部门的最新生效日期检查员工是否为部门经理?

Sql 如何在部门的最新生效日期检查员工是否为部门经理?,sql,oracle,plsql,case,Sql,Oracle,Plsql,Case,我在SQL Oracle视图中编写条件时遇到问题 我有两个表,下面是您需要的字段的名称: EMPLOYEE_TBL (employee_id) DEPARTMENT_TBL (department_id, manager_id, effective_date, active_status) 我必须在选定的情况下对以下条件进行编码: FLAG = 'Y' if the employee is the manager of AT LEAST ONE department at the depart

我在SQL Oracle视图中编写条件时遇到问题

我有两个表,下面是您需要的字段的名称:

EMPLOYEE_TBL (employee_id)
DEPARTMENT_TBL (department_id, manager_id, effective_date, active_status)
我必须在选定的情况下对以下条件进行编码:

FLAG = 'Y' if the employee is the manager of AT LEAST ONE department at the department's 
       latest (max) effective date and that the department has active_status = 'A' 
       at its max effective date
FLAG = 'N' otherwise
以下是我目前所拥有的,但它不能满足我的要求:

SELECT A.EMPLOYEE_ID, B.EFFECTIVE_DATE, B.ACTIVE_STATUS, 
 CASE WHEN EXISTS (SELECT DISTINCT Z.MANAGER_ID FROM DEPARTMENT_TBL Z 
                    WHERE Z.MANAGER_ID = B.MANAGER_ID
                      AND Z.DEPARTMENT_ID = B.DEPARTMENT_ID
                      AND Z.MANAGER_ID = A.EMPLOYEE_ID /* this is the condition */
                      AND Z.EFFECTIVE_DATE = (SELECT MAX(Y.EFFECTIVE_DATE) 
                                              FROM DEPARTMENT_TBL Y 
                                              WHERE Y.DEPARTMENT_ID = Z.DEPARTMENT_ID 
                                              AND Y.EFFECTIVE_DATE <= SYSDATE)
                      AND Z.ACTIVE_STATUS = 'A')
 THEN 'Y' ELSE 'N' END AS FLAG
FROM EMPLOYEE_TBL A LEFT JOIN DEPARTMENT_TBL B 
ON A.employee_id = B.manager_id
如何解决此问题?

您可以使用row\u number获取部门的最新记录。这大大简化了查询:

select e.*,
       (case when d.department_id is not null then 'Y' else 'N' end) as isManager
from employee_tbl e left join
     (select d.*,
             row_number() over (partition by d.department_id
                                order by d.effective_date desc) as seqnum
      from department_tbl d
      where d.effective_date < sysdate
     ) d
     on e.department_id = d.department_id and d.active_status = 'A' and
        seqnum = 1;
SQL修改了输入错误。

您可以使用行号获取部门的最新记录。这大大简化了查询:

select e.*,
       (case when d.department_id is not null then 'Y' else 'N' end) as isManager
from employee_tbl e left join
     (select d.*,
             row_number() over (partition by d.department_id
                                order by d.effective_date desc) as seqnum
      from department_tbl d
      where d.effective_date < sysdate
     ) d
     on e.department_id = d.department_id and d.active_status = 'A' and
        seqnum = 1;

SQL修改了输入错误。

你说得对,但是当我想返回所有员工并让标志指示他们是否仍然是经理时,这只会返回作为经理的员工managers@jpw我刚刚发现另一个问题。请检查我对原始帖子和新SQLFiddle所做的编辑。你是对的,但这只会返回作为经理的员工,而我只想返回所有员工,并让标志指示他们是否仍然是经理managers@jpw我刚刚发现另一个问题。请检查我对原始帖子和新SQLFiddle所做的编辑。你是对的,但这只会返回作为经理的员工,而我只想返回所有员工,并让标志指示他们是否仍然是经理managers@jpw我刚刚发现另一个问题。请检查我对原始帖子和新SQLFIDLE所做的编辑。@jpw。这很容易添加到on子句中。您的查询中的d.effective\u状态似乎有错误。。。选中此处只需在e.department\u id=d.department\u id和d.active\u status='A'和seqnum=1@jpw . . . 这很容易添加到on子句中。您的查询中的d.effective\u状态似乎有错误。。。选中此处只需在e.department\u id=d.department\u id和d.active\u status='A'和seqnum=1@jpw . . . 这很容易添加到on子句中。您的查询中的d.effective\u状态似乎有错误。。。选中此处只需在e.department\u id=d.department\u id和d.active\u status='A'和seqnum=1上将d.effective\u状态更改为d.active\u状态