次のようなテーブルがあります。
テーブル
id
=====
1
1
2
2
6
6
7
5
5
9
新しいテーブルを作成する以外に、重複を削除する必要があります。それを行う1つの方法は次のとおりです。
create table_new (select distinct id from table )
重複を削除する削除コマンドはありますか?
IMHO一般的なケース(Ansi SQL)では、一意のキーフィールドがないと行を区別できず、削除できないため、実行できません。
しかし、MySQL では、この UGLY クエリを実行できます。@S 文字列を使用して ID を蓄積するため、大きなテーブルでは使用しないでください。
set @S:=',';
delete from t
where if(LOCATE(CONCAT(',',ID,','),@S)>0,'del',@S:=CONCAT(@S,ID,','))='del'
グーグルで最初のヒット:
この記事では、一時テーブルを使用して一意のレコードを保持し、元のテーブルをクリアして一意のレコードをテーブルに追加する方法について説明しています。おそらく、ストアドプロシージャを作成することで実行できますが、これを1回だけ実行する必要があると思いますか?それから私は説明された方法で行きます。また、将来の問題を防ぐために、そのフィールドに一意または主キーの制約を使用して、同じ値を持つ2つのレコードを持つことができないようにします。
cteを使用できます:
;WITH cte
AS (SELECT ROW_NUMBER() OVER (PARTITION BY ID
ORDER BY ( SELECT 0)) RN
FROM #MyTable)
DELETE FROM cte
WHERE RN > 1
これにより、個別のレコード用に一時テーブルまたは保持テーブルを作成する必要がなくなります。重複する値を含む可能性のある追加の列がある場合は、それらを式ID
の後に追加できますPARTITION BY
。
ID 値が重複している理由が気になりますが。
直接の実装があるかどうかはわかりませんが、興味のある関数の実装を次に示します。
function RemoveDuplicates($TableName, $UniqueFieldName, $IDFieldName, $FirstFoundIDValue)
{
$Query = "DELETE FROM ".$TableName." ".
"WHERE ".$IDFieldName." IN ".
"( SELECT a.".$IDFieldName." ".
"FROM ".$TableName." a, ".$TableName." b ".
"WHERE (a.".$UniqueFieldName." = b.".$UniqueFieldName.") ".
"AND (a.".$IDFieldName." > ".$FirstFoundIDValue.") ".
"GROUP BY a.".$IDFieldName." ".
"HAVING COUNT(a.".$UniqueFieldName.") > 1 ".
")";
db_query($Query);
// Example Use:
// delete from tblps_CommEquip
// where PSID in
// ( select a.PSID from tblps_CommEquip a, tblps_CommEquip b
// where (a.CommEquipType = b.CommEquipType)
// AND (a.PSID > 80)
// group by a.PSID
// having count(a.CommEquipType) > 1
// )
}
すべての重複を削除する単一のクエリ (Oracle でテスト済み)
行 ID が含まれていない my_table から削除します (id で temp_table グループから min(rowid) を選択します);
説明:
Oracleはデフォルトですべての行にrowidを与えます(他のデータベースには同じまたは類似のものがあると確信しています)。
最初に内部クエリを見てみましょう。Group by 句は、いくつかの基準 (この場合は Id) に基づいて行をグループ化します。複数の列に基づいてグループ化することもできます (col1、col2 でグループ化)。min(rowid) と言うときは、重複する列を持つ複数の行がある場合に備えて、1 つの行 ID を返すようにしているだけです。
外側の削除クエリは単純です。内側のクエリによって返されないテーブルから他のすべて (重複) を削除するだけです。
サンプルコード
重複する行を削除する最善の方法は、テーブル内の各レコードを一意に識別する主キー列を提供することです。