teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

5

レイアウト修正

2015/12/10 06:00

投稿

Mikan
Mikan

スコア7

title CHANGED
File without changes
body CHANGED
@@ -90,10 +90,13 @@
90
90
 
91
91
 
92
92
  **以下追記2(質問に対する回答で使用した方法)**
93
+
93
94
  調べること
95
+
94
96
  * 重複してる行(ID1とID2)の値が本当に一致しているか。
95
97
 
96
98
  調べた際の条件
99
+
97
100
  * table_2のID1とID2は目で見た感じはcol_1~col_10の値が同じ
98
101
  * ID1とID2に関してはすべてのカラム(col_1~col_10)に値がある。
99
102
 
@@ -109,5 +112,5 @@
109
112
  AND a.col_10 = b.col_10
110
113
  ```
111
114
 
112
- 上記のsqlを流すと、ID2の結果が返ってくる。
115
+ 上記のsqlを流すと、ID2のデータが返ってくる。
113
116
  そのため、ID1とID2のcol_1~col_10の値は同値と判断した。

4

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

2015/12/10 06:00

投稿

Mikan
Mikan

スコア7

title CHANGED
File without changes
body CHANGED
@@ -86,4 +86,28 @@
86
86
 
87
87
  2.5 何度か2.2と2.4のSQLを交互に実行してみても結果変わらず。(2.4の行をコピペしてwhere句を削って実行しているだけなので、typoはしていないと思う。)
88
88
 
89
- というような手順で重複行が見つかってると判断しています。
89
+ というような手順で重複行が見つかってると判断しています。
90
+
91
+
92
+ **以下追記2(質問に対する回答で使用した方法)**
93
+ 調べること
94
+ * 重複してる行(ID1とID2)の値が本当に一致しているか。
95
+
96
+ 調べた際の条件
97
+ * table_2のID1とID2は目で見た感じはcol_1~col_10の値が同じ
98
+ * ID1とID2に関してはすべてのカラム(col_1~col_10)に値がある。
99
+
100
+ 流したSQL
101
+ ```sql
102
+ SELECT b.*
103
+ FROM table_2 a, table_2 b
104
+ WHERE a.id = ID1
105
+ AND a.id <> b.id
106
+ AND a.col_1 = b.col_1
107
+ :
108
+ :
109
+ AND a.col_10 = b.col_10
110
+ ```
111
+
112
+ 上記のsqlを流すと、ID2の結果が返ってくる。
113
+ そのため、ID1とID2のcol_1~col_10の値は同値と判断した。

3

Primary key等の情報を追記

2015/12/10 05:55

投稿

Mikan
Mikan

スコア7

title CHANGED
File without changes
body CHANGED
@@ -40,12 +40,13 @@
40
40
  なお、詳細なtable等の条件は
41
41
 
42
42
  * 各テーブルにはidとcreated_at, updated_atがある。(idはオートインクリメント)
43
+ * 各テーブルはPrimary keyはidのみ
44
+ * 各テーブルにPrimary以外のユニーク制約はない。
43
45
  * col_1: int(11)
44
46
  * col_2 ~ col_9: VARCHAR(255)
45
47
  * col_10: DECIMAL(4,1)
46
48
  * 文字コードは全カラムがCAHRSET: utf-8, COLLATE: utf8_unicode_ci
47
49
  * 今回のケースでtable_2にinsertされた件数は7000件弱
48
-
49
50
  のようになっています。
50
51
 
51
52
  また、2の重複の見つけ方について、補足・修正します。

2

insert件数の追記

2015/12/10 05:27

投稿

Mikan
Mikan

スコア7

title CHANGED
File without changes
body CHANGED
@@ -44,6 +44,7 @@
44
44
  * col_2 ~ col_9: VARCHAR(255)
45
45
  * col_10: DECIMAL(4,1)
46
46
  * 文字コードは全カラムがCAHRSET: utf-8, COLLATE: utf8_unicode_ci
47
+ * 今回のケースでtable_2にinsertされた件数は7000件弱
47
48
 
48
49
  のようになっています。
49
50
 

1

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

2015/12/10 03:32

投稿

Mikan
Mikan

スコア7

title CHANGED
File without changes
body CHANGED
@@ -5,27 +5,83 @@
5
5
  1 空のtable_2に対して、group byしたtable_1のデータを登録する。
6
6
 
7
7
  ```sql
8
- INSERT table_2(col_1, col_2, col_3, col_4, col_5, col_6, col_7, col_8, col_9)
8
+ INSERT table_2(col_1, col_2, col_3, col_4, col_5, col_6, col_7, col_8, col_9, col_10)
9
- SELECT col_1, col_2, col_3, col_4, col_5, col_6, col_7, col_8, col_9
9
+ SELECT col_1, col_2, col_3, col_4, col_5, col_6, col_7, col_8, col_9, col_10
10
10
  FROM table_1
11
- GROUP BY col_1, col_2, col_3, col_4, col_5, col_6, col_7, col_8, col_9
11
+ GROUP BY col_1, col_2, col_3, col_4, col_5, col_6, col_7, col_8, col_9, col_10
12
12
  ```
13
13
 
14
- 2 table_2をgroup byする重複行が見つかる。
14
+ 2 table_2をgroup byする 重複行が見つかる。
15
15
  ```sql
16
- SELECT col_1, col_2, col_3, col_4, col_5, col_6, col_7, col_8, col_9
16
+ SELECT col_1, col_2, col_3, col_4, col_5, col_6, col_7, col_8, col_9, col_10
17
17
  FROM table_2
18
- GROUP BY col_1, col_2, col_3, col_4, col_5, col_6, col_7, col_8, col_9
18
+ GROUP BY col_1, col_2, col_3, col_4, col_5, col_6, col_7, col_8, col_9, col_10
19
19
  ```
20
20
 
21
+
21
22
  なお、条件は
22
23
 
23
- * グループ化するカラムは、integerまたはdecimal
24
+ * グループ化するカラムは、integerまたはdecimal**またはVARCHAR**
24
25
  * col_1, col_2以外にはNULLが入っている可能性がある。
25
26
  * table_1のデータ数は, 22000件程度
26
27
 
27
- のようになっています。
28
28
 
29
29
  このような結果になるのは何故なのでしょうか。
30
30
 
31
- よろしくお願いします。
31
+ よろしくお願いします。
32
+
33
+ **以下追記**
34
+
35
+ カラムの数及び型に記載の誤りがありました。
36
+
37
+ * カラムは全部で10個
38
+ * 型に文字型がある(太字で修正してます。)
39
+
40
+ なお、詳細なtable等の条件は
41
+
42
+ * 各テーブルにはidとcreated_at, updated_atがある。(idはオートインクリメント)
43
+ * col_1: int(11)
44
+ * col_2 ~ col_9: VARCHAR(255)
45
+ * col_10: DECIMAL(4,1)
46
+ * 文字コードは全カラムがCAHRSET: utf-8, COLLATE: utf8_unicode_ci
47
+
48
+ のようになっています。
49
+
50
+ また、2の重複の見つけ方について、補足・修正します。
51
+
52
+ 2.1 table_1にtable_2への参照を持たせるために、下記のようなsqlを実行すると重複エラーが起きる。
53
+ ```sql
54
+ UPDATE table_1 t1
55
+ SET id_of_table_2 = (
56
+ SELECT id FROM table_2 t2
57
+ WHERE t1.col_1 = t2.col_1
58
+ AND t1.col_2 =t2.col_2
59
+ :
60
+ :
61
+ AND t1.col_10 =t2.col_10
62
+ ```
63
+
64
+ 2.2 重複がないことをチェックするため、下記のsqlを投げると1件もHITしない。
65
+ ```sql
66
+ SELECT *
67
+ FROM table_2
68
+ GROUP BY col_1, col_2, col_3, col_4, col_5, col_6, col_7, col_8, col_9, col_10
69
+ HAVING COUNT(id) > 1
70
+ ```
71
+
72
+ 2.3 2.1のupdate文をwhere句で範囲指定し、重複エラーをはいている行を特定し、table_2の該当行を見つける。
73
+
74
+ すると、idの1と2が同じであるように見受けられる。
75
+
76
+ 2.4 2行あると見受けられるものに絞ってGROUP BYしてみる。1件HITする。
77
+ ```sql
78
+ SELECT *
79
+ FROM table_2
80
+ WHERE id IN(1,2)
81
+ GROUP BY col_1, col_2, col_3, col_4, col_5, col_6, col_7, col_8, col_9, col_10
82
+ HAVING COUNT(id) > 1
83
+ ```
84
+
85
+ 2.5 何度か2.2と2.4のSQLを交互に実行してみても結果変わらず。(2.4の行をコピペしてwhere句を削って実行しているだけなので、typoはしていないと思う。)
86
+
87
+ というような手順で重複行が見つかってると判断しています。