0

我在网上搜索并没有找到这种类型的答案。

我有表 emp_master_data,它有很多列,但我想使用几列来过滤数据(选择查询),然后在分析之后,我想删除这些记录。

过滤器应应用于三列 emp_card_no、emp_id、enrollment_exp_dt。一个员工可以注册多次,这意味着您将拥有多个具有相同 emp_no、emp_id 和相同/不同的注册_exp_dt 的记录。

现在,我需要这样做:

  • 如果有多条记录具有相同的enrollment_exp_dt、emp_card_no 和emp_id,则删除重复记录。
  • 如果我有同一员工的多条记录但不同的enrollment_exp_dt,则删除旧记录并仅保留最新记录(不必是>sysdate)。

    请让我知道我能做的最好的方法。我确实尝试过这样做,但并没有解决所有问题。

    SELECT * FROM brm_staging A WHERE EXISTS ( SELECT 1 FROM brm_staging WHERE enrollment_exp_dt = A.enrollment_exp_dt and emp_id= A.emp_id and emp_card_no =A.emp_card_no AND ROWID < A.ROWID );

  • 4

    1 回答 1

    1

    我真的很复杂。您可以在删除之前先尝试选择语句,看看这是否有效吗?(这是第二个场景)

    DELETE FROM YOUR_TABLE T1 
    INNER JOIN (
    SELECT T2.* FROM YOUR_TABLE T2,
    (SELECT EMP_ID, CARD_NO, COUNT(*) FROM
    YOUR_TABLE 
    GROUP BY EMP_ID, CARD_NO
    HAVING COUNT(*) > 1) T3
    WHERE T2.EMP_ID=T3.EMP_ID AND T2.CARD_NO = T3.CARD_NO AND
    T2.ENROLLMENT_EXP_DT NOT IN (SELECT MAX(T4.ENROLLMENT_EXP_DT)
    FROM YOUR_TABLE T4) T5 ON
    T1.EMP_ID=T5.EMP_ID AND T1.CARD_NO=T5.CARD_NO AND T1.ENROLLMENT_EXP_DT=T5.ENROLLMENT_EXO_DT
    

    (编辑)我也认为这项工作(更简化)

    DELETE FROM YOUR_TABLE T1 
    WHERE EXISTS (
    SELECT T2.* FROM YOUR_TABLE T2,
    (SELECT EMP_ID, CARD_NO, COUNT(*) FROM
    YOUR_TABLE 
    GROUP BY EMP_ID, CARD_NO
    HAVING COUNT(*) > 1) T3
    WHERE T2.EMP_ID=T3.EMP_ID AND T2.CARD_NO = T3.CARD_NO AND
    T2.ENROLLMENT_EXP_DT NOT IN (SELECT MAX(T4.ENROLLMENT_EXP_DT)
    FROM YOUR_TABLE T4) 
    
    于 2013-10-22T18:49:22.897 回答