0

そのため、サーバー上で重複した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のすべてのエントリに重複があることがわかったので、重複をチェックすることを心配する必要はありません。

4

1 に答える 1

0

テーブルに 1 つの列を追加して個別の値を入力できれば、それは簡単です。各行をターゲットにすることができます。

それ以外の場合は、最初のステップの後、通常、ステータス S の副選択でカーソルを開き、両方のステータスが「S」である crn のみを選択し、各ループ反復で適切な crn を持つ上位 1 レコードを削除します。そうすれば、重複した crn/status ペアを取り除くことができます。

于 2012-10-26T18:10:23.233 に答える