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 と名前を付ければいいのかな、と試したのですがこれもダメ。
どうすればいいのでしょうか。お願いします。
マニュアルにあるように出来ないことは出来ませんので、別方法で回避してみてはいかがでしょう。
一時表を作成し、その一時表とのサブクエリを利用して行を削除します。
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 );
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)
コメント(1件)
オライリーの本には「MySQLでは無理」と明記されていなかったので出来ると思っていました。
Oracle等と比べるとサブクエリ関係はまだ弱いのでしょうか。
「一時表」は作ったことが無いので、今からやってみようと思います。またご報告します。早朝よりありがとうございます。