0

私はネットを検索しましたが、この種の答えは見つかりませんでした。

多くの列を持つテーブル emp_master_data がありますが、少数の列を使用してデータをフィルター処理し (選択クエリ)、分析後にそれらのレコードを削除したいと考えています。

フィルターは、emp_card_no、emp_id、enrollment_exp_dt の 3 つの列に適用する必要があります。従業員は複数回登録できます。つまり、同じ emp_no、emp_id、および同じ/異なる registration_exp_dt を持つ複数のレコードを持つことになります。

今、私はこれを行う必要があります:

  • 同じ registration_exp_dt、emp_card_no、および emp_id を持つレコードが複数ある場合は、重複するレコードを削除します。
  • 同じ従業員に対して複数のレコードがあるが、異なる registration_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

    私は本当に複雑になりました。削除する前に最初にselectステートメントを試して、これが機能しているかどうかを確認できますか? (これは2番目のシナリオ用です)

    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 に答える