SQL DB2:我需要根据查询结果筛选结果

mnowg1ta  于 2022-11-07  发布在  DB2
关注(0)|答案(2)|浏览(176)

我需要获取给定输入employee_id和给定输入日期的id:
条件:我需要查询在输入中指定日期或指定日期之前登记的员工。
约束条件:员工在给定输入日期或之前不应具有“已取消登记”状态。
例如:如果employee_id为32456和32458,并且给定的输入日期为2021-01-01,则预期结果为employee_Id为32458的id值3。employee_Id(32456)不符合条件,因为他已在给定的输入日期或之前注销。
我有一个表,下面的列:
| 标识符|日期|状态|雇员标识|
| - -|- -|- -|- -|
| 一个|2021年1月1日|已登记|小行星32456|
| 2个|2021年1月1日|已取消注册|小行星32456|
| 三个|2020年1月1日|已登记|小行星32458|
以下是我所尝试的:

select a.ID 
  from  EMPLOYEE  a
 where (a.employee_id='34526' 
        or a.employee_id = '32547')
   and (
        (a.status= 'enrolled' 
         and {d '2021-10-10'} >= p.date
        ) 
        or (a.status NOT IN 'disEnrolled' 
             and {d '2021-10-10'} <= a.date
           )
       );
ibrsph3r

ibrsph3r1#

您可以使用简单的EXISTS子句来实现所需的结果-

SELECT Id
  FROM EMPLOYEE E
 WHERE status = 'enrolled'
   AND NOT EXISTS (SELECT NULL
                     FROM EMPLOYEE E2
                    WHERE E.employee_Id = E2.employee_Id
                      AND E2.status = 'disEnrolled')
   AND date <= DATE '2021-01-01'
   AND Employee_ids IN (empId_1, empId_2, .....);   -- Youe Employee ID list

但此查询将生成2条记录,分别为32457和32458,而不是仅生成32458。

olqngx59

olqngx592#

WITH TAB (id, date, status, employee_Id) AS
(
VALUES
  (1, '2021-01-01', 'enrolled', 32456)
, (2, '2021-01-01', 'disEnrolled', 32456)
, (4, '2020-01-01', 'enrolled', 32458)
)
SELECT DISTINCT employee_Id
FROM TAB A
WHERE status = 'enrolled'
AND NOT EXISTS
(
SELECT 1
FROM TAB B
WHERE B.employee_ID = A.employee_Id 
AND B.status = 'disEnrolled' 
AND B.date <= '2021-01-01'
)

相关问题