正規化されていないテーブル(table_1)の共通項目を別テーブル(table_2)にくくりだし、それを参照するようにしようとしています。
そこで、まずtable_1のデータをgroup byし重複を取り除いて、table_2に登録しようとしたのですが、group byしたはずなのにtable_2に重複行が現れます。(実行したのは下記の手順)
1 空のtable_2に対して、group byしたtable_1のデータを登録する。
sql
1INSERT table_2(col_1, col_2, col_3, col_4, col_5, col_6, col_7, col_8, col_9, col_10) 2SELECT col_1, col_2, col_3, col_4, col_5, col_6, col_7, col_8, col_9, col_10 3FROM table_1 4GROUP BY col_1, col_2, col_3, col_4, col_5, col_6, col_7, col_8, col_9, col_10
2 table_2をgroup byする 重複行が見つかる。
sql
1SELECT col_1, col_2, col_3, col_4, col_5, col_6, col_7, col_8, col_9, col_10 2FROM table_2 3GROUP BY col_1, col_2, col_3, col_4, col_5, col_6, col_7, col_8, col_9, col_10
なお、条件は
- グループ化するカラムは、integerまたはdecimalまたはVARCHAR
- col_1, col_2以外にはNULLが入っている可能性がある。
- table_1のデータ数は, 22000件程度
このような結果になるのは何故なのでしょうか。
よろしくお願いします。
以下追記
カラムの数及び型に記載の誤りがありました。
- カラムは全部で10個
- 型に文字型がある(太字で修正してます。)
なお、詳細なtable等の条件は
- 各テーブルにはidとcreated_at, updated_atがある。(idはオートインクリメント)
- 各テーブルはPrimary keyはidのみ
- 各テーブルにPrimary以外のユニーク制約はない。
- col_1: int(11)
- col_2 ~ col_9: VARCHAR(255)
- col_10: DECIMAL(4,1)
- 文字コードは全カラムがCAHRSET: utf-8, COLLATE: utf8_unicode_ci
- 今回のケースでtable_2にinsertされた件数は7000件弱
のようになっています。
また、2の重複の見つけ方について、補足・修正します。
2.1 table_1にtable_2への参照を持たせるために、下記のようなsqlを実行すると重複エラーが起きる。
sql
1UPDATE table_1 t1 2SET id_of_table_2 = ( 3 SELECT id FROM table_2 t2 4 WHERE t1.col_1 = t2.col_1 5 AND t1.col_2 =t2.col_2 6 : 7 : 8 AND t1.col_10 =t2.col_10
2.2 重複がないことをチェックするため、下記のsqlを投げると1件もHITしない。
sql
1SELECT * 2FROM table_2 3GROUP BY col_1, col_2, col_3, col_4, col_5, col_6, col_7, col_8, col_9, col_10 4HAVING COUNT(id) > 1
2.3 2.1のupdate文をwhere句で範囲指定し、重複エラーをはいている行を特定し、table_2の該当行を見つける。
すると、idの1と2が同じであるように見受けられる。
2.4 2行あると見受けられるものに絞ってGROUP BYしてみる。1件HITする。
sql
1SELECT * 2FROM table_2 3WHERE id IN(1,2) 4GROUP BY col_1, col_2, col_3, col_4, col_5, col_6, col_7, col_8, col_9, col_10 5HAVING COUNT(id) > 1
2.5 何度か2.2と2.4のSQLを交互に実行してみても結果変わらず。(2.4の行をコピペしてwhere句を削って実行しているだけなので、typoはしていないと思う。)
というような手順で重複行が見つかってると判断しています。
以下追記2(質問に対する回答で使用した方法)
調べること
- 重複してる行(ID1とID2)の値が本当に一致しているか。
調べた際の条件
- table_2のID1とID2は目で見た感じはcol_1~col_10の値が同じ
- ID1とID2に関してはすべてのカラム(col_1~col_10)に値がある。
流したSQL
sql
1SELECT b.* 2FROM table_2 a, table_2 b 3WHERE a.id = ID1 4 AND a.id <> b.id 5 AND a.col_1 = b.col_1 6 : 7 : 8 AND a.col_10 = b.col_10
上記のsqlを流すと、ID2のデータが返ってくる。
そのため、ID1とID2のcol_1~col_10の値は同値と判断した。
