【发布时间】:2015-06-20 13:24:20
【问题描述】:
我在 SQL Oracle 的视图中编码条件时遇到问题。
我有 2 个表格,这里是您需要的字段名称:
EMPLOYEE_TBL (employee_id)
DEPARTMENT_TBL (department_id, manager_id, effective_date, active_status)
我必须在 SELECT CASE 中编写以下条件:
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
这里是 SQLFiddle:http://sqlfiddle.com/#!4/241d99/1
遗留问题:员工 35 的标志必须为“Y”,因为他是部门 D7777 在部门最大生效日期的经理。
这里是 DEPARTMENT_TBL:
DEPARTMENT_ID MANAGER_ID EFFECTIVE_DATE EFFECTIVE_STATUS
D1273 35 2006-01-01 A
D1273 35 2011-12-21 A -- here flag of 35 is 'N'
D1273 04 2012-03-05 A
D1000 04 2012-12-12 A
D7777 04 2009-05-14 A
D7777 35 2011-09-26 A -- but here flag of 35 is 'Y'
如何解决这个问题?
【问题讨论】:
-
你是对的,但是当我想返回所有员工并且只是让标志表明他们是否仍然是经理时,那只会返回作为经理的员工
-
@jpw 我刚刚发现了另一个问题。请检查我对原始帖子和新 SQLFiddle 所做的编辑。