1

次のようなテーブルがあります。

テーブル

id
=====
1
1
2
2
6
6
7
5
5
9

新しいテーブルを作成する以外に、重複を削除する必要があります。それを行う1つの方法は次のとおりです。

create table_new (select distinct id from table )

重複を削除する削除コマンドはありますか?

4

7 に答える 7

1

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'
于 2012-08-08T15:16:41.363 に答える
0

グーグルで最初のヒット:

http://support.microsoft.com/kb/139444/en-us?fr=1

この記事では、一時テーブルを使用して一意のレコードを保持し、元のテーブルをクリアして一意のレコードをテーブルに追加する方法について説明しています。おそらく、ストアドプロシージャを作成することで実行できますが、これを1回だけ実行する必要があると思いますか?それから私は説明された方法で行きます。また、将来の問題を防ぐために、そのフィールドに一意または主キーの制約を使用して、同じ値を持つ2つのレコードを持つことができないようにします。

于 2012-08-08T06:51:19.403 に答える
0

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 値が重複している理由が気になりますが。

  • これが行 ID の場合は、IDENTITY を使用して ID を自動インクリメントすることをお勧めします。
  • それがアイテムまたは参照 ID である場合、重複を追加しないようにします (これは構造によっては完全に間違っている可能性があります)。
于 2012-08-08T06:52:01.277 に答える
0

直接の実装があるかどうかはわかりませんが、興味のある関数の実装を次に示します。

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
// )
} 
于 2012-08-08T07:02:40.363 に答える
0

すべての重複を削除する単一のクエリ (Oracle でテスト済み)

行 ID が含まれていない my_table から削除します (id で temp_table グループから min(rowid) を選択します);

説明:

Oracleはデフォルトですべての行にrowidを与えます(他のデータベースには同じまたは類似のものがあると確信しています)。

最初に内部クエリを見てみましょう。Group by 句は、いくつかの基準 (この場合は Id) に基づいて行をグループ化します。複数の列に基づいてグループ化することもできます (col1、col2 でグループ化)。min(rowid) と言うときは、重複する列を持つ複数の行がある場合に備えて、1 つの行 ID を返すようにしているだけです。

外側の削除クエリは単純です。内側のクエリによって返されないテーブルから他のすべて (重複) を削除するだけです。

于 2012-08-08T06:55:17.997 に答える
0

サンプルコード

http://sqlfiddle.com/#!3/56182/2

于 2012-08-08T07:01:08.450 に答える
0

重複する行を削除する最善の方法は、テーブル内の各レコードを一意に識別する主キー列を提供することです。

于 2012-08-08T10:10:56.990 に答える