ホームページ >データベース >mysql チュートリアル >一意の識別子を持たないテーブルから重複行を効率的に削除するにはどうすればよいですか?

一意の識別子を持たないテーブルから重複行を効率的に削除するにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2025-01-23 01:41:08645ブラウズ

How to Efficiently Remove Duplicate Rows from a Table Without Unique Identifiers?

一意の識別子のない重複行を効率的に削除します

データ テーブルに一意の行識別子がない場合、重複の削除が困難になることがあります。この記事では、最初に出現した行を保持しながら重複行を削除するための効率的なソリューションを提供します。

重複行を含むテーブルを見てみましょう:

col1 col2 col3 col4 col5 col6 col7
john 1 1 1 1 1 1
john 1 1 1 1 1 1
sally 2 2 2 2 2 2
sally 2 2 2 2 2 2

重複行を削除した後の望ましい結果は次のとおりです:

col1 col2 col3 col4 col5 col6 col7
john 1 1 1 1 1 1
sally 2 2 2 2 2 2

CTE と ROW_NUMBER を使用したソリューション

このメソッドは、共通テーブル式 (CTE) と ROW_NUMBER() 関数を利用します。 CTE は、特定の順序に基づいて各行にシーケンス番号 (RN) を割り当て、重複を識別して削除できるようにします。

これは、段階的な手順を含む SQL クエリです:

<code class="language-sql">WITH CTE AS (
   SELECT [col1], [col2], [col3], [col4], [col5], [col6], [col7],
       RN = ROW_NUMBER() OVER (PARTITION BY col1 ORDER BY col1) -- 为 col1 定义的每个组内分配序列号
   FROM dbo.Table1
)
DELETE FROM CTE WHERE RN > 1; -- 删除 RN 大于 1 的行(表示重复项)</code>

手順:

  • CTE の作成: WITH ステートメントは、テーブルの列を含む CTE という名前の CTE を作成し、ROW_NUMBER() 関数を使用して各行に RN 値を割り当てます。 PARTITION BY 句は、col1 列に基づいて行をグループ化し、各グループ内で行を並べ替えて順序を決定します。
  • ROW_NUMBER() 関数: ROW_NUMBER() 関数は、PARTITION BY 句で定義された各パーティション内の各行に対して 1 から始まる整数のシーケンスを生成します。
  • 削除操作: DELETE ステートメントは、CTE 内の RN が 1 より大きい行を削除し、重複する行を排除します。

出力:

クエリを実行すると、更新されたテーブルには次の内容が含まれます:

col1 col2 col3 col4 col5 col6 col7
john 1 1 1 1 1 1
sally 2 2 2 2 2 2

以上が一意の識別子を持たないテーブルから重複行を効率的に削除するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。