SQLで重複レコードを削除する方法

このQ&Aのポイント
  • SQLで重複レコードを削除する方法について解説します。
  • 重複レコードを削除するためのSQL文の書き方をご紹介します。
  • MySQLを使用して重複レコードを削除する方法について詳しく説明します。
回答を見る
  • ベストアンサー

SQLで、重複レコードを削除

no type name ---------------------------- 1 1 peach 1 1 peach 2 5 tomato 4 6 apple 4 6 apple 1 1 peach  上記のように、重複するレコード(行)が存在してしまっているテーブルで、重複をなくす処理を、SQLで簡単に行なうにはどうしたら良いでしょうか。MySQLです。上の例では、下のように更新したいのです。よろしくお願いします。 no type name ---------------------------- 1 1 peach 2 5 tomato 4 6 apple

  • MySQL
  • 回答数3
  • ありがとう数11

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

http://ma-bank.com/item/600 失礼! 仕事に出かける直前だったのでチラ見で回答。 やり方は、上記サイトを!

その他の回答 (2)

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.3

joinしてlimit指定でdeleteできると楽なのですが、標準のSQLではないようです まぁ普通に考えればプライマリーキーやユニークキーのないテーブルは データを特定過程が煩雑なので通常のSQL文では処理は難しいですね。 つまりはテーブルの作り方が変・・・ということです。 普通は重複してから消すのではなく、重複しないように属性をつけます 無理やりdeleteする方法としては (1)distincでテンポラリにデータを移し、truncateした後戻す (2)プロシージャで消す のどちらかが妥当です

回答No.1

http://www.dbonline.jp/mysql/select/index13.html SELECT DISTINCT * FROM テーブル1; MySQLもAccessも一緒ですね。

amadaira
質問者

お礼

ありがとうございます。 でも、SELECT したいのではなく、テーブルから重複レコードを削除して、重複をなくしてしまいたいのです。(つまり、テーブルを更新したいのです)

関連するQ&A

  • 重複するレコードを調べるSQL

    重複するレコードを調べるSQL 初歩的な質問ですみません! 重複するレコードを調べるために以下のようなSQLを作ったのですが、 遅くて困っています。 もっと速くする方法があれば教えてください! 異なるカテゴリーでも商品コードが重複しているものがないかを探すSQLです。 SELECT A.商品コード, A.X, B.カテゴリー FROM (SELECT COUNT(商品コード) X, 商品コード FROM テーブルA WHERE 追加年月 = 201008 GROUP BY 商品コード) A, (SELECT 商品コード, カテゴリー FROM テーブルA WHERE 追加年月 = 201008 ) B " WHERE A.X >= 2 AND B.商品コード = A.商品コード

  • 時間範囲が重複したレコードを返すSQL

    PostgreSQL(データベース)の カラムに指定した時間範囲が存在する場合、エラーとし 存在しない場合、INSERTしたいのですが、 どのようなSQLを書けば良いでしょうか? ◆カラム内容 開始時間 終了時間 12:00   14:00 14:00   19:00 という2つのレコードが格納されていた場合に、 以下のSELECT→INSERTという流れで考えています。 19:00から19:05はOKで、INSERT処理を行う 18:55から19:05はNGで、重複したレコードを返す 10:00から12:00はOKで、INSERT処理を行う 10:00から12:05はNGで、重複したレコードを返す

  • 重複レコードの上書きについて

    重複レコードを上書きするSQL構文についての質問です。 SELECT文で更新対象のレコードが、 すでに存在しているかをどうかを確認にしてから、 UPDATE文を発行して更新する方法と、 DELETE文を発行して更新対象のレコードを削除した後に INSERT文で更新文のデータを追加する方法があるのですが、 処理的にはどちらが早くなるのものなんでしょうか?

  • 2つのテーブルで重複する値のレコードを削除したい

    削除クエリ?重複クエリ?について教えてください。 テーブル1 フィールド"番号"には 1 2 3 テーブル2 フィールド"番号"には 3 4 5 があるとします。 「テーブル2と重複しているテーブル1のレコードを削除する」 (この場合「3」が重複しているのでテーブル1の3が入力されているレコードを削除) としたいのですがどいゆうSQL文を書けばいいのかわかりません。 ご教授よろしくお願いします。

  • 2つの項目が重複するレコードを抽出する方法はありますか?

    MySQL4.1で既存データに対し複合キーを新しく設定したいのですが、 ALTER TABLE `test` ADD PRIMARY KEY (`a`,`b`) としても重複データが存在する為、作成できませんでした。 10万件あるテーブルから重複するレコードを手動で削除したいのですが、aとbが重複しているレコードだけ抽出するSQL文はありますでしょうか?

    • ベストアンサー
    • MySQL
  • 重複レコードを高速で取得するSQL

    Access(mdb)から約2万件レコードのあるテーブルがあるとします。 列数は20ほど。 その中から、3つの列において重複しているレコードを取得したいのですが、 高速に取得する方法はありますでしょうか? (VB.NETで、重複レコードをユーザーに示す処理を作成したいのです) 以下のSQLを試したところ、1分以上時間がかかってしまいました。 ----------------------------- SELECT * FROM テーブルA table1 WHERE EXISTS ( SELECT * FROM テーブルA table2 WHERE table1.列A = table2.列A   table1.列B = table2.列B   table1.列C = table2.列C GROUP BY table2.列A HAVING COUNT(table2.列A) > 1 ) ----------------------------- アドバイスをお願いします。

  • php+MySQLでレコードが何行目かを知るには

    お世話になります。 php+MySQLの環境でレコードが何行目になるかを 知る方法を教えてください。 まず下記のようなテーブルがあるとします。 |  id  |  name  | -------------------- |  1 |  山田  | |  2 |  田中  | |  3 |  中村  | |  5 |  山本  | idはAutoIncrementで振っています。 nameは重複することはありません。 レコードは更新状況により削除されることがあるため、 idは必ずしも連番になっているわけではありません。 このような状況で上のテーブルの「山本」を ORDER BY id ASC で取得する際に「山本は4行目である」 ということがわかる方法を教えてください。 よろしくお願いいたします。

    • ベストアンサー
    • MySQL
  • テーブルのレコード削除ができません

    SQLserver2000を触る事になり思った通りにならず困っております。 テーブルに主キーを設定せずデータ型を「int」でフィールドに重複する数値を入れてしまいました。 後から重複入力のミスに気づき重複したレコードを 「テーブルを開く」-「全行を返す」から1レコードを 削除しようとしたのですが、 「キー列の情報が足りないか、正しくありません。更新の影響を受ける行が多すぎます。」と表示され削除できません。 このテーブルは、多くのビューで使用してすでに動いている再作成することは難しいです。 このレコードを削除する良い方法はあるのでしょうか。 ご存知の先生方ご指導よろしくお願いいたします。

  • 重複が

    新規登録の時の重複をチェックしたいです テーブルのカラムはシンプルにidとnameとpassだけです nameに同じ名前の人がいると困るので、HTMLフォームから送られた名前と登録してある名前の重複がないかチェックするようにできますか? やってみましたが動きません(ーー;; $name = mysql_real_escape_string($_POST['name']); $name3=array(); $name2 = mysql_query('SELECT name FROM hoge2 WHERE name=$name'); while($data = mysql_fetch_assoc($name2)) { array_push($name3, $data['name']); } if(isset($name3)){ print "重複があります"; }else{ //ここからsql $sql = sprintf('INSERT INTO hoge2 SET name="%s", pass="%s"', $name, mysql_real_escape_string($_POST['pass']) ); //ここまで mysql_query($sql) or die(mysql_error()); }

    • ベストアンサー
    • MySQL
  • 一行目のレコードを2度表示させたい。

    レコードを読み込むのとは別に、最終書き込み者(ソートした最初のレコード)を表示させたいのですが、mysql_fetch_array($rst)を読み込ませると1位行目が消え、次ぎにmysql_fetch_array($rst)が読み込む時には2行目からになります。 ------------------------- 最終書き込み者 一太郎さん「一番目のタイトル」 -レコードの一覧- □一太郎 一番目タイトル □次郎  2番目のタイトル □佐武郎 三番目のタイトル ------------------------- としたいのですが。 SQLを2度実行すればできるのですが、無駄な処理な気もします。 別のテーブルやこの情報だけtextに保存するのも無駄な気もするし。 //一番目をゲット $sql = "select * from siritori order by db_no desc limit 1;"; $rst = mysql_query($sql,$con); //$rst2 = $rst; $col = mysql_fetch_array($rst); print "最終書き込み者".$col["name"]."さん".$col["title"]."<hr>"; //一覧を表示 $sql = "select * from siritori order by db_no desc limit 10;"; $rst = mysql_query($sql,$con); //SQL配列読み込み(select文) while($col = mysql_fetch_array($rst)){ print $col["name"]."さん".$col["title"]."<br>".$col["kome"]."<hr>";} //$rst2 = $rst; 配列をコピーできないかなー?とかもやったのですができない。 なんとか巧い解決方法はないでしょうか? 連想配置や、MySQLには詳しくないのでお教えください。

    • ベストアンサー
    • MySQL