如何删除Oracle数据库中的重复行以及旧记录

时间:2013-10-21 20:46:06

标签: sql oracle10g

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

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

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

现在,我需要这样做:

  • 如果有多个记录具有相同的enrollment_exp_dt,emp_card_no和emp_id,则删除重复的记录。
  • 如果我有同一名员工的多条记录但注册号不同,则删除旧记录并保留最新记录(不必是> 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 );

  • 1 个答案:

    答案 0 :(得分: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)