そのため、サーバー上で重複したSQLスクリプトを実行していましたが、つい最近までそれを認識していませんでした。基本的に、同じ列x(crn)を持つ2つのエントリがある行がたくさんあります。
最初は同じ列y(ステータス)も入力されました。このアプリケーションでは、ユーザーが列y(ステータス)を更新します。ただし、現在、ステータスが「S」の行とステータスが「S」以外の行の2つの行があります。私の目標:
重複するCRNがあり、ステータスがSであるテーブルからすべてを削除します。重複がない限り行を削除したくありませんが、重複している場合は、ステータスが「S」の行のみを削除します。 。また、両方のステータスがSの場合は両方のレコードを削除したくないのですが、削除した場合は、次のダウンロードでコースを再度取得するため、それほど大きな問題にはなりません。
必要な行をクエリするためのselectステートメントの作成を開始しましたが、ONLY SELECT IFDUPLICATEEXISTSの部分を実行する方法がわかりません。重複が存在する場合にのみレコードを取得するには、UNIONまたはLEFTJOINなどを実行する必要があるように感じます。
SELECT * FROM
cas_usuECourses
WHERE
crn IN (SELECT crn FROM cas_usuECourses GROUP BY crn having count(1) > 1)
AND status = 'S'
AND termCode = 201320
編集:言う方法はありますか...上記ですが、両方の重複に「S」がある場合は、そのうちの1つだけを削除しますか?
編集:私はこれが私に似合うと「思います」。何かご意見は?
SELECT id FROM (
SELECT id, Row_Number() Over (Partition By crn ORDER BY id DESC) as ranking
FROM cas_usuECourses
WHERE status = 'S'
AND termCode = 201320
) as ranking
WHEREランキング=1
これにより、ステータスが「S」のすべてのIDが得られ、「S」のIDが2つある場合は、2番目に作成されたIDが得られると思います。termCodeのすべてのエントリに重複があることがわかったので、重複をチェックすることを心配する必要はありません。