查询以基于日期值消除行并在另一行

时间:2015-10-28 12:05:17

标签: sql oracle duplicates

我想根据以下标准消除行 如果列WORK_DATE具有重复日期,则我需要根据CHEQUE_DATE 23-JAN-2015排除该行,但保留其他行。 主要唯一键是EMP_ID

表格内容:

 EMP_ID |  WORK_DATE  | CHEQUE_DATE
------------------------------------
  12345 | 10-SEP-2014 | 23-JAN-2015
  12345 | 10-SEP-2014 | 03-OCT-2015
  32789 | 14-OCT-2014 | 23-JAN-2015
  32789 | 14-OCT-2014 | 10-OCT-2015

因此,在工作日期与员工重复的所有情况下,请删除CHEQUE_DATE Jan 23, 2015的行。

我想可以使用UNION子句解决它。

2 个答案:

答案 0 :(得分:0)

您可以将条件转换为where条款。假设检查没有重复日期:

delete from data
    where exists (select 1
                  from data d2
                  where d2.col1 = data.col1 and d2.work_date = data.work_date and
                        d2.cheque_date <> data.cheque_date
                 ) and
          cheque_date = date '2015-01-23';

答案 1 :(得分:0)

谢谢戈登,基于你的建议,我提到了以下内容。 它有点复杂,因为涉及多个表......但你的方向有所帮助。

SELECT
           T.EMP_GROUP_CODE  GROUP_CODE,
           E.EMPLOYEE_ID   EMP_ID,
           SUBSTR(E.SURNAME||', '||nvl(E.FIRST_NAME,' '),1,30)
                                  EMPLOYEE_NAME,
          SUBSTR(TO_CHAR(T.WORK_DATE,'DD-MON-YYYY'),1,11) WORK_DATE,
           SUBSTR(TO_CHAR(C.CHEQUE_DATE,'DD-MON-YYYY'),1,11) CHQ_DATE,
           L.ABBRV_NAME  LOCATION_NM,
           SUBSTR(R.SURNAME||', '||R.FIRST_NAME,1,25) REPLACEMENT_NAME,
           T.UNITS_IN_PERIOD,
           T.HOURLY_RATE,
           T.WORK_DATE  SORT_DATE FROM EC_LOCATION             L,
                  EC_PAY_PERIOD_CALENDAR  C,
                  EC_EMPLOYEE             E,
                  EC_EMPLOYEE             R,
                  EC_EMPLOYEE_TIMESHEETS  T
            WHERE L.CODE = T.LOCATION_CODE
              AND C.PAY_NUMBER = T.PAY_NUMBER
              AND C.EMP_GROUP_CODE = T.EMP_GROUP_CODE
              AND E.EMPLOYEE_ID = T.EMPLOYEE_ID
              AND T.REPLACED_EMPLOYEE_ID = R.EMPLOYEE_ID (+)
              AND (:P_EMP_GROUP = 'ALL'
                 OR  T.EMP_GROUP_CODE = :P_EMP_GROUP)
              AND T.WORK_DATE BETWEEN to_date(:P_START_DATE,'YYYYMMDD') AND to_date(:P_END_DATE,'YYYYMMDD')
              AND T.EMP_GROUP_CODE IN ('5132E','5132S','5131DE','5131DS')
              AND (EXISTS (select 1 from ec_employee_timesheets a, ec_pay_period_calendar b where a.PAY_NUMBER = b.PAY_NUMBER
                       AND a.EMP_GROUP_CODE = b.EMP_GROUP_CODE AND SUBSTR(TO_CHAR(b.CHEQUE_DATE,'DD-MON-YYYY'),1,11) <>
    '23-JAN-2015'));