MySQL5の質問です。


table_a
id
title
honbun

以上のようなテーブルがあります。
ここからtitleが同じものを削除したいと思います。3つ同じものがあれば1つだけ残します。

手元のオライリーSQLクックブックによると

delete from table_a
where id not in(select min(id) from talbe_a group by title)

これで出来るはずなんですけど、エラーが。

(省略)for update in FROM clause

調べてみると
http://dev.mysql.com/doc/refman/4.1/ja/subquery-errors.html
ここの一番下です。同じテーブル名を使ってはダメらしいのです。

table as A と名前を付ければいいのかな、と試したのですがこれもダメ。

どうすればいいのでしょうか。お願いします。

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2007/04/17 04:25:02
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答2件)

id:bonlife No.1

回答回数421ベストアンサー獲得回数75

ポイント35pt

マニュアルにあるように出来ないことは出来ませんので、別方法で回避してみてはいかがでしょう。

一時表を作成し、その一時表とのサブクエリを利用して行を削除します。

create temporary table tmp_uniq_id as select min(id) as min_id from table_a group by title;
delete from table_a where id not in (select min_id from tmp_uniq_id );
id:toteri No.2

回答回数52ベストアンサー獲得回数3

ポイント35pt

delete from table_a

where id not in(select min(id) from talbe_a group by title)

本題とずれますが、サブクエリー中のテーブル名が“talbe_a”になっていますよ。

下記のようにそれぞれのテーブルにasで別名をつけてみてはいかがでしょうか?

delete from table_a as a

where id not in(select min(id) from table_a as b group by title)

  • id:tokyosmash
    bonlifeさん回答ありがとうございます。
    オライリーの本には「MySQLでは無理」と明記されていなかったので出来ると思っていました。
    Oracle等と比べるとサブクエリ関係はまだ弱いのでしょうか。

    「一時表」は作ったことが無いので、今からやってみようと思います。またご報告します。早朝よりありがとうございます。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません