質問編集履歴

5

レイアウト修正

2015/12/10 06:00

投稿

Mikan
Mikan

スコア7

test CHANGED
File without changes
test CHANGED
@@ -182,14 +182,20 @@
182
182
 
183
183
  **以下追記2(質問に対する回答で使用した方法)**
184
184
 
185
+
186
+
185
187
  調べること
186
188
 
189
+
190
+
187
191
  * 重複してる行(ID1とID2)の値が本当に一致しているか。
188
192
 
189
193
 
190
194
 
191
195
  調べた際の条件
192
196
 
197
+
198
+
193
199
  * table_2のID1とID2は目で見た感じはcol_1~col_10の値が同じ
194
200
 
195
201
  * ID1とID2に関してはすべてのカラム(col_1~col_10)に値がある。
@@ -220,6 +226,6 @@
220
226
 
221
227
 
222
228
 
223
- 上記のsqlを流すと、ID2の結果が返ってくる。
229
+ 上記のsqlを流すと、ID2のデータが返ってくる。
224
230
 
225
231
  そのため、ID1とID2のcol_1~col_10の値は同値と判断した。

4

質問に対する回答のSQLを記載

2015/12/10 06:00

投稿

Mikan
Mikan

スコア7

test CHANGED
File without changes
test CHANGED
@@ -175,3 +175,51 @@
175
175
 
176
176
 
177
177
  というような手順で重複行が見つかってると判断しています。
178
+
179
+
180
+
181
+
182
+
183
+ **以下追記2(質問に対する回答で使用した方法)**
184
+
185
+ 調べること
186
+
187
+ * 重複してる行(ID1とID2)の値が本当に一致しているか。
188
+
189
+
190
+
191
+ 調べた際の条件
192
+
193
+ * table_2のID1とID2は目で見た感じはcol_1~col_10の値が同じ
194
+
195
+ * ID1とID2に関してはすべてのカラム(col_1~col_10)に値がある。
196
+
197
+
198
+
199
+ 流したSQL
200
+
201
+ ```sql
202
+
203
+ SELECT b.*
204
+
205
+ FROM table_2 a, table_2 b
206
+
207
+ WHERE a.id = ID1
208
+
209
+ AND a.id <> b.id
210
+
211
+ AND a.col_1 = b.col_1
212
+
213
+ :
214
+
215
+ :
216
+
217
+ AND a.col_10 = b.col_10
218
+
219
+ ```
220
+
221
+
222
+
223
+ 上記のsqlを流すと、ID2の結果が返ってくる。
224
+
225
+ そのため、ID1とID2のcol_1~col_10の値は同値と判断した。

3

Primary key等の情報を追記

2015/12/10 05:55

投稿

Mikan
Mikan

スコア7

test CHANGED
File without changes
test CHANGED
@@ -82,6 +82,10 @@
82
82
 
83
83
  * 各テーブルにはidとcreated_at, updated_atがある。(idはオートインクリメント)
84
84
 
85
+ * 各テーブルはPrimary keyはidのみ
86
+
87
+ * 各テーブルにPrimary以外のユニーク制約はない。
88
+
85
89
  * col_1: int(11)
86
90
 
87
91
  * col_2 ~ col_9: VARCHAR(255)
@@ -91,8 +95,6 @@
91
95
  * 文字コードは全カラムがCAHRSET: utf-8, COLLATE: utf8_unicode_ci
92
96
 
93
97
  * 今回のケースでtable_2にinsertされた件数は7000件弱
94
-
95
-
96
98
 
97
99
  のようになっています。
98
100
 

2

insert件数の追記

2015/12/10 05:27

投稿

Mikan
Mikan

スコア7

test CHANGED
File without changes
test CHANGED
@@ -90,6 +90,8 @@
90
90
 
91
91
  * 文字コードは全カラムがCAHRSET: utf-8, COLLATE: utf8_unicode_ci
92
92
 
93
+ * 今回のケースでtable_2にinsertされた件数は7000件弱
94
+
93
95
 
94
96
 
95
97
  のようになっています。

1

すいません。条件が間違っていました。

2015/12/10 03:32

投稿

Mikan
Mikan

スコア7

test CHANGED
File without changes
test CHANGED
@@ -12,29 +12,31 @@
12
12
 
13
13
  ```sql
14
14
 
15
- INSERT table_2(col_1, col_2, col_3, col_4, col_5, col_6, col_7, col_8, col_9)
15
+ INSERT table_2(col_1, col_2, col_3, col_4, col_5, col_6, col_7, col_8, col_9, col_10)
16
16
 
17
- SELECT col_1, col_2, col_3, col_4, col_5, col_6, col_7, col_8, col_9
17
+ SELECT col_1, col_2, col_3, col_4, col_5, col_6, col_7, col_8, col_9, col_10
18
18
 
19
19
  FROM table_1
20
20
 
21
- GROUP BY col_1, col_2, col_3, col_4, col_5, col_6, col_7, col_8, col_9
21
+ GROUP BY col_1, col_2, col_3, col_4, col_5, col_6, col_7, col_8, col_9, col_10
22
22
 
23
23
  ```
24
24
 
25
25
 
26
26
 
27
- 2 table_2をgroup byする重複行が見つかる。
27
+ 2 table_2をgroup byする 重複行が見つかる。
28
28
 
29
29
  ```sql
30
30
 
31
- SELECT col_1, col_2, col_3, col_4, col_5, col_6, col_7, col_8, col_9
31
+ SELECT col_1, col_2, col_3, col_4, col_5, col_6, col_7, col_8, col_9, col_10
32
32
 
33
33
  FROM table_2
34
34
 
35
- GROUP BY col_1, col_2, col_3, col_4, col_5, col_6, col_7, col_8, col_9
35
+ GROUP BY col_1, col_2, col_3, col_4, col_5, col_6, col_7, col_8, col_9, col_10
36
36
 
37
37
  ```
38
+
39
+
38
40
 
39
41
 
40
42
 
@@ -42,15 +44,13 @@
42
44
 
43
45
 
44
46
 
45
- * グループ化するカラムは、integerまたはdecimal
47
+ * グループ化するカラムは、integerまたはdecimal**またはVARCHAR**
46
48
 
47
49
  * col_1, col_2以外にはNULLが入っている可能性がある。
48
50
 
49
51
  * table_1のデータ数は, 22000件程度
50
52
 
51
53
 
52
-
53
- のようになっています。
54
54
 
55
55
 
56
56
 
@@ -59,3 +59,115 @@
59
59
 
60
60
 
61
61
  よろしくお願いします。
62
+
63
+
64
+
65
+ **以下追記**
66
+
67
+
68
+
69
+ カラムの数及び型に記載の誤りがありました。
70
+
71
+
72
+
73
+ * カラムは全部で10個
74
+
75
+ * 型に文字型がある(太字で修正してます。)
76
+
77
+
78
+
79
+ なお、詳細なtable等の条件は
80
+
81
+
82
+
83
+ * 各テーブルにはidとcreated_at, updated_atがある。(idはオートインクリメント)
84
+
85
+ * col_1: int(11)
86
+
87
+ * col_2 ~ col_9: VARCHAR(255)
88
+
89
+ * col_10: DECIMAL(4,1)
90
+
91
+ * 文字コードは全カラムがCAHRSET: utf-8, COLLATE: utf8_unicode_ci
92
+
93
+
94
+
95
+ のようになっています。
96
+
97
+
98
+
99
+ また、2の重複の見つけ方について、補足・修正します。
100
+
101
+
102
+
103
+ 2.1 table_1にtable_2への参照を持たせるために、下記のようなsqlを実行すると重複エラーが起きる。
104
+
105
+ ```sql
106
+
107
+ UPDATE table_1 t1
108
+
109
+ SET id_of_table_2 = (
110
+
111
+ SELECT id FROM table_2 t2
112
+
113
+ WHERE t1.col_1 = t2.col_1
114
+
115
+ AND t1.col_2 =t2.col_2
116
+
117
+ :
118
+
119
+ :
120
+
121
+ AND t1.col_10 =t2.col_10
122
+
123
+ ```
124
+
125
+
126
+
127
+ 2.2 重複がないことをチェックするため、下記のsqlを投げると1件もHITしない。
128
+
129
+ ```sql
130
+
131
+ SELECT *
132
+
133
+ FROM table_2
134
+
135
+ GROUP BY col_1, col_2, col_3, col_4, col_5, col_6, col_7, col_8, col_9, col_10
136
+
137
+ HAVING COUNT(id) > 1
138
+
139
+ ```
140
+
141
+
142
+
143
+ 2.3 2.1のupdate文をwhere句で範囲指定し、重複エラーをはいている行を特定し、table_2の該当行を見つける。
144
+
145
+
146
+
147
+ すると、idの1と2が同じであるように見受けられる。
148
+
149
+
150
+
151
+ 2.4 2行あると見受けられるものに絞ってGROUP BYしてみる。1件HITする。
152
+
153
+ ```sql
154
+
155
+ SELECT *
156
+
157
+ FROM table_2
158
+
159
+ WHERE id IN(1,2)
160
+
161
+ GROUP BY col_1, col_2, col_3, col_4, col_5, col_6, col_7, col_8, col_9, col_10
162
+
163
+ HAVING COUNT(id) > 1
164
+
165
+ ```
166
+
167
+
168
+
169
+ 2.5 何度か2.2と2.4のSQLを交互に実行してみても結果変わらず。(2.4の行をコピペしてwhere句を削って実行しているだけなので、typoはしていないと思う。)
170
+
171
+
172
+
173
+ というような手順で重複行が見つかってると判断しています。