回答編集履歴

3

修正

2017/10/28 00:55

投稿

sazi
sazi

スコア25173

test CHANGED
@@ -72,15 +72,15 @@
72
72
 
73
73
  ```
74
74
 
75
- ここ、region.opt_approach_infoとregion.opt_visit_historyをjoinしてますけど、件数求めるだけならleft joinなので意味がないですね。もう一つも同じです。
75
+ ここ、```region.opt_approach_info``````region.opt_visit_history```をjoinしてますけど、**件数求めるだけならleft joinなので意味がない**ですね。もう一つも同じです。
76
76
 
77
- それから、駆動表のように記述されている、t_shop でのgroup by も固定値で行ってるので意味ないですね。
77
+ それから、駆動表のように記述されている、```t_shop```でのgroup by も固定値で行ってるので意味ないですね。
78
78
 
79
79
 
80
80
 
81
81
  単に書かれていることを、join部分をinnerとして組み立て直すとこんな感じかな。
82
82
 
83
- left joinが正しいならそもそもjoinは不要。
83
+ 関係性においてleft joinが正しいならそもそもjoinは不要。
84
84
 
85
85
  ```SQL
86
86
 

2

追記

2017/10/28 00:55

投稿

sazi
sazi

スコア25173

test CHANGED
@@ -31,3 +31,109 @@
31
31
  普段から、条件部分の記述にDB項目自体を演算しない癖をつけていた方がいいですよ。
32
32
 
33
33
  チューニングでインデックス追加するような場合でも、手直しは不要になりますから。
34
+
35
+
36
+
37
+ 追記
38
+
39
+ ---
40
+
41
+ 意味不明なところを確認してみましょう。
42
+
43
+ ```SQL
44
+
45
+ select
46
+
47
+ count(*) as cnt,
48
+
49
+ '001' as grp_cd
50
+
51
+ from (
52
+
53
+ select
54
+
55
+ ttd.server_code as server_code,
56
+
57
+ ttd.item1 as item1
58
+
59
+ from region.t_tatemono_data ttd
60
+
61
+ where date_format(ttd.item108, '%Y-%m-%d') between /*startYmd_alert*/'2017-10-01' and /*endYmd_alert*/'2017-10-31'
62
+
63
+ ) as abc
64
+
65
+ left join region.opt_approach_info oa
66
+
67
+ on oa.server_code=abc.server_code and oa.tatemono_code=abc.item1 and oa.charge_shop_code <> '000PAR'
68
+
69
+ left join region.opt_visit_history ov
70
+
71
+ on ov.id = oa.last_visit_history_id
72
+
73
+ ```
74
+
75
+ ここ、region.opt_approach_infoとregion.opt_visit_historyをjoinしてますけど、件数求めるだけならleft joinなので意味がないですね。もう一つも同じです。
76
+
77
+ それから、駆動表のように記述されている、t_shop でのgroup by も固定値で行ってるので意味ないですね。
78
+
79
+
80
+
81
+ 単に書かれていることを、join部分をinnerとして組み立て直すとこんな感じかな。
82
+
83
+ left joinが正しいならそもそもjoinは不要。
84
+
85
+ ```SQL
86
+
87
+ select
88
+
89
+ '全国' as name
90
+
91
+ , '001' as grp_cd
92
+
93
+ , '1' as kaiso
94
+
95
+ , '' as oya_grp_cd
96
+
97
+ , coalesce((
98
+
99
+ select count(*)
100
+
101
+ from region.t_tatemono_data ttd
102
+
103
+ inner join region.opt_approach_info oa
104
+
105
+ on oa.server_code=ttd.server_code and oa.tatemono_code=ttd.item1
106
+
107
+ and oa.charge_shop_code <> '000PAR'
108
+
109
+ inner join region.opt_visit_history ov
110
+
111
+ on ov.id = oa.last_visit_history_id
112
+
113
+ where ttd.item108 between str_to_date(/*startYmd_alert*/'2017-10-01', '%Y-%m-%d')
114
+
115
+ and str_to_date(/*endYmd_alert*/'2017-10-31', '%Y-%m-%d')
116
+
117
+ ), 0) + coalesce((
118
+
119
+ select count(*)
120
+
121
+ from region.opt_building ob
122
+
123
+ inner join region.opt_approach_info oa
124
+
125
+ on oa.opt_building_id=ob.id and oa.charge_shop_code <> '000PAR'
126
+
127
+ inner join region.opt_visit_history ov
128
+
129
+ on ov.id = oa.last_visit_history_id
130
+
131
+ where ob.regist_date between str_to_date(/*startYmd_alert*/'2017-10-01', '%Y-%m-%d')
132
+
133
+ and str_to_date(/*endYmd_alert*/'2017-10-31', '%Y-%m-%d')
134
+
135
+ ), 0) as oya_cnt
136
+
137
+ ```
138
+
139
+ 何にしても、実行計画でパフォーマンスは確認された方がよいかと思います。

1

推敲

2017/10/27 12:48

投稿

sazi
sazi

スコア25173

test CHANGED
@@ -14,15 +14,15 @@
14
14
 
15
15
  ```SQL
16
16
 
17
- where ttd.item108 between str_to_date(/*startYmd_alert*/'2017-10-01', '%Y-%M-%d')
17
+ where ttd.item108 between str_to_date(/*startYmd_alert*/'2017-10-01', '%Y-%m-%d')
18
18
 
19
- and str_to_date(/*endYmd_alert*/'2017-10-31', '%Y-%M-%d')
19
+ and str_to_date(/*endYmd_alert*/'2017-10-31', '%Y-%m-%d')
20
20
 
21
21
 
22
22
 
23
- where ob.regist_date between str_to_date(/*startYmd_alert*/'2017-10-01', '%Y-%M-%d')
23
+ where ob.regist_date between str_to_date(/*startYmd_alert*/'2017-10-01', '%Y-%m-%d')
24
24
 
25
- and str_to_date(/*endYmd_alert*/'2017-10-31', '%Y-%M-%d')
25
+ and str_to_date(/*endYmd_alert*/'2017-10-31', '%Y-%m-%d')
26
26
 
27
27
  ```
28
28