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

回答編集履歴

3

修正

2017/10/28 00:55

投稿

sazi
sazi

スコア25430

answer CHANGED
@@ -35,11 +35,11 @@
35
35
  left join region.opt_visit_history ov
36
36
  on ov.id = oa.last_visit_history_id
37
37
  ```
38
- ここ、region.opt_approach_infoとregion.opt_visit_historyをjoinしてますけど、件数求めるだけならleft joinなので意味がないですね。もう一つも同じです。
38
+ ここ、```region.opt_approach_info``````region.opt_visit_history```をjoinしてますけど、**件数求めるだけならleft joinなので意味がない**ですね。もう一つも同じです。
39
- それから、駆動表のように記述されている、t_shop でのgroup by も固定値で行ってるので意味ないですね。
39
+ それから、駆動表のように記述されている、```t_shop```でのgroup by も固定値で行ってるので意味ないですね。
40
40
 
41
41
  単に書かれていることを、join部分をinnerとして組み立て直すとこんな感じかな。
42
- left joinが正しいならそもそもjoinは不要。
42
+ 関係性においてleft joinが正しいならそもそもjoinは不要。
43
43
  ```SQL
44
44
  select
45
45
  '全国' as name

2

追記

2017/10/28 00:55

投稿

sazi
sazi

スコア25430

answer CHANGED
@@ -14,4 +14,57 @@
14
14
  ```
15
15
  item108 や regist_date がインデックスに含まれるなら、効果が望めます。
16
16
  普段から、条件部分の記述にDB項目自体を演算しない癖をつけていた方がいいですよ。
17
- チューニングでインデックス追加するような場合でも、手直しは不要になりますから。
17
+ チューニングでインデックス追加するような場合でも、手直しは不要になりますから。
18
+
19
+ 追記
20
+ ---
21
+ 意味不明なところを確認してみましょう。
22
+ ```SQL
23
+ select
24
+ count(*) as cnt,
25
+ '001' as grp_cd
26
+ from (
27
+ select
28
+ ttd.server_code as server_code,
29
+ ttd.item1 as item1
30
+ from region.t_tatemono_data ttd
31
+ where date_format(ttd.item108, '%Y-%m-%d') between /*startYmd_alert*/'2017-10-01' and /*endYmd_alert*/'2017-10-31'
32
+ ) as abc
33
+ left join region.opt_approach_info oa
34
+ on oa.server_code=abc.server_code and oa.tatemono_code=abc.item1 and oa.charge_shop_code <> '000PAR'
35
+ left join region.opt_visit_history ov
36
+ on ov.id = oa.last_visit_history_id
37
+ ```
38
+ ここ、region.opt_approach_infoとregion.opt_visit_historyをjoinしてますけど、件数求めるだけならleft joinなので意味がないですね。もう一つも同じです。
39
+ それから、駆動表のように記述されている、t_shop でのgroup by も固定値で行ってるので意味ないですね。
40
+
41
+ 単に書かれていることを、join部分をinnerとして組み立て直すとこんな感じかな。
42
+ left joinが正しいならそもそもjoinは不要。
43
+ ```SQL
44
+ select
45
+ '全国' as name
46
+ , '001' as grp_cd
47
+ , '1' as kaiso
48
+ , '' as oya_grp_cd
49
+ , coalesce((
50
+ select count(*)
51
+ from region.t_tatemono_data ttd
52
+ inner join region.opt_approach_info oa
53
+ on oa.server_code=ttd.server_code and oa.tatemono_code=ttd.item1
54
+ and oa.charge_shop_code <> '000PAR'
55
+ inner join region.opt_visit_history ov
56
+ on ov.id = oa.last_visit_history_id
57
+ where ttd.item108 between str_to_date(/*startYmd_alert*/'2017-10-01', '%Y-%m-%d')
58
+ and str_to_date(/*endYmd_alert*/'2017-10-31', '%Y-%m-%d')
59
+ ), 0) + coalesce((
60
+ select count(*)
61
+ from region.opt_building ob
62
+ inner join region.opt_approach_info oa
63
+ on oa.opt_building_id=ob.id and oa.charge_shop_code <> '000PAR'
64
+ inner join region.opt_visit_history ov
65
+ on ov.id = oa.last_visit_history_id
66
+ where ob.regist_date between str_to_date(/*startYmd_alert*/'2017-10-01', '%Y-%m-%d')
67
+ and str_to_date(/*endYmd_alert*/'2017-10-31', '%Y-%m-%d')
68
+ ), 0) as oya_cnt
69
+ ```
70
+ 何にしても、実行計画でパフォーマンスは確認された方がよいかと思います。

1

推敲

2017/10/27 12:48

投稿

sazi
sazi

スコア25430

answer CHANGED
@@ -6,11 +6,11 @@
6
6
 
7
7
  意味不明なところが見受けられますが、取り敢えずは日付の抽出条件のところを修正した方が良いですね。
8
8
  ```SQL
9
- where ttd.item108 between str_to_date(/*startYmd_alert*/'2017-10-01', '%Y-%M-%d')
9
+ where ttd.item108 between str_to_date(/*startYmd_alert*/'2017-10-01', '%Y-%m-%d')
10
- and str_to_date(/*endYmd_alert*/'2017-10-31', '%Y-%M-%d')
10
+ and str_to_date(/*endYmd_alert*/'2017-10-31', '%Y-%m-%d')
11
11
 
12
- where ob.regist_date between str_to_date(/*startYmd_alert*/'2017-10-01', '%Y-%M-%d')
12
+ where ob.regist_date between str_to_date(/*startYmd_alert*/'2017-10-01', '%Y-%m-%d')
13
- and str_to_date(/*endYmd_alert*/'2017-10-31', '%Y-%M-%d')
13
+ and str_to_date(/*endYmd_alert*/'2017-10-31', '%Y-%m-%d')
14
14
  ```
15
15
  item108 や regist_date がインデックスに含まれるなら、効果が望めます。
16
16
  普段から、条件部分の記述にDB項目自体を演算しない癖をつけていた方がいいですよ。