2005年06月24日(金) [長年日記]
■ [db] 重複レコードの削除
データベースの主キーの作り方がおかしくて、同一とみなせるレコードが複数存在している状況になっていた。そこで、それらの重複レコードから余分なものを削除するSQLを実行したかったがどのようなSQLにすればいいのか分からなかった。
検索すると、同じような話が[pgsql-jp: 29392]で始まるスレッドにあった。
itemno | name --------+-------------- 001 | apple 002 | orange 003 | strawberry 004 | grape 005 | water melon 006 | orange 007 | apple 008 | orange 009 | pine apple 010 | banana 011 | apple --------+--------------
というテーブルにおいて
- nameが重複しているレコードを列挙したい
- 余分なレコードを削除してnameが重複しない状態にしたい
という話。[pgsql-jp: 29395]に
delete from items where itemno in ( select itemno from items except select min(itemno) from items group by name );
select distinct a.name from items a, items b where a.name = b.name and a.itemno != b.itemno;
という案があった。なるほど。
先の案のような感じでできそうだと思ったが、MySQL4.0系はSQLの副問い合わせをサポートしていないようでうまくいかなかった。ので、後の案を参考にして検索->削除の2段階を行うプログラムを作って対処した。
(追記)
CodeZineに重複行削除の話があったので、よく読んでないけどメモ。
■ やること
- オーブンレンジ用べんり棚
- ブラウンの安い電動歯ブラシ買う
- 蛍光灯を捨てる