はじめに
事の発端は、とあるテーブルの重複を削除するというあるある事象だったが、単純な重複削除ではない内容であり、無駄にGROUP BYとかHAVINGとか色々使ってドツボにハマってしまったので、備忘録としてメモ。
環境
Windows10
PostgreSQL 13.2
PgAdmin 4.29
#状況説明
実際のテーブルに比べて相当デフォルメしているが、以下のようなカラムとデータが入ったテーブルがある。
Noはユニークだが、それ以外は同じデータである。dateは日付なのでまちまちだが、今回の抽出対象ではない。
・それぞれのカラムのデータ型,PKはテキトー。
・テーブル名は仮で「dup_test」とする。
#やること
・Name1, Name2, Name3が同じデータは削除する。ただし、1つは残す。
#やったこと
まずはNoが1のデータが残れば良いよね、と考えた。
No=1 以外 のデータを取るには以下のSQLになる。
(基本中の基本ですがとりあえず記載します。)
select * from dup_test B where A.no <> 1
で、このデータをサブクエリにして、DELETEすればOKじゃないかと。
DELETE FROM dup_test A WHERE exists( select * from dup_test where A.no <> 1 )
とりあえず上手くいった。(と思う。)
#おわりに
同じケースであれば、取り急ぎこれで重複削除はできそう。
私自身SQLはそれなりに利用しているが、正直知見が乏しいので、シンプルで良い方法はこれからも模索していきたい。