回答編集履歴

3

追記

2017/07/13 07:06

投稿

yambejp
yambejp

スコア114843

test CHANGED
@@ -87,3 +87,53 @@
87
87
  )as エリアID ,顧客ID,エリア from tbl as t1;
88
88
 
89
89
  ```
90
+
91
+
92
+
93
+ # エリアテーブルが必須な場合
94
+
95
+ そうなると話は逆ですね
96
+
97
+ 正規化において、データからマスターテーブルを作るような泥縄方式はNGです。
98
+
99
+ 最初からエリアテーブルをつくっておいて、それを元に顧客マスターの
100
+
101
+ データを埋めるのが正しいやり方です。
102
+
103
+
104
+
105
+ とは言え、間違った方法で顧客マスターを作っちゃったので、管理方法を
106
+
107
+ 変えたいという意図であれば、前回提示したとおりエリアテーブルを
108
+
109
+ 抽出するSQLを利用してエリアテーブルを一度つくればいいでしょう
110
+
111
+
112
+
113
+ ```SQL
114
+
115
+ create table area(
116
+
117
+ エリアID int,
118
+
119
+ 顧客ID int(6) unsigned zerofill,
120
+
121
+ エリア varchar(20),
122
+
123
+ 責任者ID int null,
124
+
125
+ unique(エリアID,顧客ID));
126
+
127
+ ```
128
+
129
+ データ投入
130
+
131
+ ```SQL
132
+
133
+ insert into area select distinct (select count(distinct 顧客ID)+1 from tbl as t2
134
+
135
+ where t1.顧客ID=t2.顧客ID and t1.エリア>t2.エリア
136
+
137
+ )as エリアID ,顧客ID,エリア,null from tbl as t1;
138
+
139
+ ```

2

追記

2017/07/13 07:06

投稿

yambejp
yambejp

スコア114843

test CHANGED
@@ -71,3 +71,19 @@
71
71
  WHERE t0.顧客ID=t3.顧客ID and t0.エリア=t3.エリア;
72
72
 
73
73
  ```
74
+
75
+
76
+
77
+ エリアテーブルはインタラクティブに参照できるので不要では?
78
+
79
+ 上記更新のうちエリアテーブルに該当する箇所
80
+
81
+ ```SQL
82
+
83
+ select (select count(distinct 顧客ID)+1 from tbl as t2
84
+
85
+ where t1.顧客ID=t2.顧客ID and t1.エリア>t2.エリア
86
+
87
+ )as エリアID ,顧客ID,エリア from tbl as t1;
88
+
89
+ ```

1

sample

2017/07/13 05:59

投稿

yambejp
yambejp

スコア114843

test CHANGED
@@ -5,3 +5,69 @@
5
5
  思いますがそうなっているようには見えません
6
6
 
7
7
  エリアIDはなにに紐付いているのでしょうか?
8
+
9
+
10
+
11
+ # sample
12
+
13
+ あらかじめエリアIDカラムを作っておくといいでしょう。
14
+
15
+ (エリアカラムが不要であれば後で削除します)
16
+
17
+ ```ここに言語を入力
18
+
19
+ create table tbl(
20
+
21
+ 顧客ID int(6) unsigned zerofill,
22
+
23
+ 拠点ID int,
24
+
25
+ 拠点名 varchar(20),
26
+
27
+ 住所 varchar(100),
28
+
29
+ エリア varchar(20),
30
+
31
+ エリアID int null,
32
+
33
+ 電話番号 varchar(20)
34
+
35
+ );
36
+
37
+
38
+
39
+ insert into tbl values
40
+
41
+ (1,1,'A店','東京都足立区〇〇〇〇','足立区',NULL,'000-000-0000'),
42
+
43
+ (1,2,'B店','東京都足立区××××','足立区',NULL,'111-111-1111'),
44
+
45
+ (1,3,'C店','東京都墨田区□□□□','墨田区',NULL,'222-222-2222'),
46
+
47
+ (2,1,'H店','東京都足立区△△△△','足立区',NULL,'333-333-3333'),
48
+
49
+ (2,2,'I店','東京都台東区◎◎◎◎','台東区',NULL,'444-444-4444'),
50
+
51
+ (3,1,'X店','東京都練馬区◆◆◆◆','練馬区',NULL,'555-555-5555');
52
+
53
+
54
+
55
+ ```
56
+
57
+ エリア名順に採番してエリアIDに埋め込みます
58
+
59
+ ```SQL
60
+
61
+ update tbl as t0,
62
+
63
+ (select (select count(distinct 顧客ID)+1 from tbl as t2
64
+
65
+ where t1.顧客ID=t2.顧客ID and t1.エリア>t2.エリア
66
+
67
+ )as エリアID ,顧客ID,エリア from tbl as t1) as t3
68
+
69
+ set t0.エリアID=t3.エリアID
70
+
71
+ WHERE t0.顧客ID=t3.顧客ID and t0.エリア=t3.エリア;
72
+
73
+ ```