0

テーブルから重複するエントリを削除するためにこの削除クエリを作成しましたが、このクエリを実行すると、古い行が保持され、最新の行が削除されます。挿入された最新の行を保持し、古い行を削除したい。ORDER BY削除クエリに句を追加しましたが、機能していません。

DELETE t2
FROM   user_deprovision t1
JOIN   user_deprovision t2 ON (
    t2.UserName  = t1.UserName  AND
    t2.GroupName = t1.Groupname AND
    t2.id > t1.id)
ORDER BY t1.DeletedDate;

どうすればこれを達成できますか。

4

1 に答える 1

0

ユーザー名とグループ名の最新時刻を返すクエリを書きましょう。

SELECT
    UserName, GroupName, MAX(deprovision_time)
FROM
    user_deprovision
GROUP BY
    UserName, GroupName

では、これを目的に合わせて調整してみましょう。Oracle では、それを一時テーブルに変換するために何かをするかもしれませんが、ここでは代わりに相関サブクエリを使用します。

DELETE FROM user_deprovision AS dp1
WHERE dp1.deprovision_time <
    ANY (SELECT deprovision_time FROM user_deprovision AS dp2
         WHERE dp1.UserName  = dp2.UserName
         AND   dp1.GroupName = dp2.GroupName);

代わりに、これを結合に変えることができます。

SELECT dp1.id
FROM   user_deprovision AS dp1
JOIN   user_deprovision AS dp2
ON     dp1.UserName  = dp2.UserName
AND    dp1.GroupName = dp2.GroupName
WHERE
       dp1.deprovision_time < dp2.deprovision_time

対応する削除は次のとおりです。

DELETE FROM user_deprovision
WHERE id IN (
    SELECT dp1.id
    FROM   user_deprovision AS dp1
    JOIN   user_deprovision AS dp2
    ON     dp1.UserName  = dp2.UserName
    AND    dp1.GroupName = dp2.GroupName
    WHERE
           dp1.deprovision_time < dp2.deprovision_time);
于 2013-06-20T03:03:43.400 に答える