1

簡単に言えば、私はプロジェクトを引き継いだのですが、データベース内のテーブルに重複除外が必要です。テーブルは次のようになります。

supply_req_id | int      | [primary key]
supply_req_dt | datetime | 
request_id    | int      | [foreign key]
supply_id     | int      | [foreign key]
is_disabled   | bit      |

同じ request_id と supply_id を持つレコードで重複が存在します。このテーブルの重複を排除するためのベスト プラクティスの方法を見つけたいと思います。

[編集]
@Kirk_Broadhurst、質問ありがとう。supply_req_id は他の場所で参照されていないため、最初のものを保持し、後続のオカレンスはすべて削除すると答えます。

楽しい休日

4

3 に答える 3

3

これにより、(supply_req_dt, request_id) グループ内の各行のランクが作成され、1 = 最低の supply_req_id から始まります。デュープの値は 1 より大きい

;WITH cDupes AS
(
    SELECT
     supply_req_id,
     ROW_NUMBER() OVER (PARTITION BY supply_req_dt, request_id ORDER BY supply_req_id) AS RowNum
    FROM
     MyTable
)
DELETE
   cDupes
WHERE
   RowNum > 1

次に、一意の制約または INDEX を追加します

CREATE UNIQUE INDEX IXU_NoDupes ON MyTable (supply_req_dt, request_id)
于 2010-12-17T04:40:09.010 に答える
2

これにはコマンドが必要なようですが、別のデータベースサーバーに慣れているためかもしれません。関連するサポート ドキュメントは次のとおりです。

SQL Server のテーブルから重複行を削除する方法 http://support.microsoft.com/kb/139444

于 2010-12-17T04:17:03.367 に答える
2

「一致」した場合にどのレコードを保持するかを決定するためのルールを明確にする必要があります。最新のもの、最も古いもの、is_disabled真または偽のいずれか?

そのルールを特定したら、残りは非常に簡単です。

  1. 保持したい記録を選択してください -distinct記録
  2. 元のテーブルに結合して、それらのレコードの ID を取得します。
  3. 結合されたデータセットにないものはすべて削除します。

ですから、「重複」ペアの最新の記録を保持したいとしましょう。クエリは次のようになります。

DELETE FROM [table] WHERE supply_req_id NOT IN
(SELECT supply_req_id from [table] t 
INNER JOIN
    (SELECT MAX(supply_req_dt) dt, request_id, supply_id 
    FROM [table] 
    GROUP BY request_id, supply_id) d
ON t.supply_req_dt = d.dt
AND t.request_id = d.request_id 
AND t.supply_id = d.supply_id)

問題は、 も複製されている場合、supply_req_dt両方の複製を保持することになります。修正は、別のことgroup byを行い、上部を選択することですid

select MAX(supply_req_id), supply_req_dt, request_id, supply_id 
group by supply_req_dt, request_id, supply_id 

暫定措置として。ただし、それを行う必要がない場合は、気にしないでください。

于 2010-12-17T04:39:40.910 に答える