回答編集履歴

4

追記

2018/11/20 01:01

投稿

sazi
sazi

スコア25195

test CHANGED
@@ -175,3 +175,37 @@
175
175
  > a.カラムB, a.カラムA, a.カラムC
176
176
 
177
177
  > b.カラムB, b.カラムA, b.カラムC
178
+
179
+
180
+
181
+ もう1パターン。(これが一番素直な絞り込み[高速?]な気がします)
182
+
183
+ ```SQL
184
+
185
+ select *
186
+
187
+ from テーブルa as a inner join テーブルb b
188
+
189
+ on a.カラムB=b.カラムB
190
+
191
+ where a.カラムC<=TO_DATE('20180930','YYYYMMDD')
192
+
193
+ and a.カラムD>=TO_DATE('20180901','YYYYMMDD')
194
+
195
+ and a.カラムC=(
196
+
197
+ select max(カラムC) from テーブルa where カラムA=a.カラムA
198
+
199
+ )
200
+
201
+ and b.カラムC<='20180930'
202
+
203
+ and b.カラムD>='20180901'
204
+
205
+ and b.カラムC=(
206
+
207
+ select max(カラムC) from テーブルb where カラムA=b.カラムA
208
+
209
+ )
210
+
211
+ ```

3

追記

2018/11/20 01:01

投稿

sazi
sazi

スコア25195

test CHANGED
@@ -124,6 +124,44 @@
124
124
 
125
125
  ```
126
126
 
127
+ または、
128
+
129
+ ```SQL
130
+
131
+ select *
132
+
133
+ from テーブルa as a inner join テーブルb b
134
+
135
+ on a.カラムB=b.カラムB
136
+
137
+ where (a.カラムA, a.カラムC) in (
138
+
139
+ select カラムA, max(カラムC) from テーブルa
140
+
141
+ where カラムC<=TO_DATE('20180930','YYYYMMDD')
142
+
143
+ and カラムD>=TO_DATE('20180901','YYYYMMDD')
144
+
145
+ group by カラムA
146
+
147
+ )
148
+
149
+ and (b.カラムA, b.カラムC = (
150
+
151
+ select カラムA, max(カラムC) from テーブルb
152
+
153
+ where カラムA=b.カラムA
154
+
155
+ and カラムC<='20180930'
156
+
157
+ and カラムD>='20180901'
158
+
159
+ group by カラムA
160
+
161
+ )
162
+
163
+ ```
164
+
127
165
  こっちだと、
128
166
 
129
167
  > --サブクエリー用

2

推敲

2018/11/20 00:52

投稿

sazi
sazi

スコア25195

test CHANGED
@@ -88,7 +88,7 @@
88
88
 
89
89
  --
90
90
 
91
- SQLを別な組み立てと、以下のようになるかと思います。
91
+ SQLを別な組み立てにすると、以下のになるかと思います。
92
92
 
93
93
  ```SQL
94
94
 

1

追記

2018/11/20 00:47

投稿

sazi
sazi

スコア25195

test CHANGED
@@ -81,3 +81,59 @@
81
81
 
82
82
 
83
83
  インデックスの並びを変えたりしながら、実行計画を見つつチューニングして下さい。
84
+
85
+
86
+
87
+ 追記
88
+
89
+ --
90
+
91
+ SQLを別な組み立てだと、以下のようになるかと思います。
92
+
93
+ ```SQL
94
+
95
+ select *
96
+
97
+ from テーブルa as a inner join テーブルb b
98
+
99
+ on a.カラムB=b.カラムB
100
+
101
+ where a.カラムC = (
102
+
103
+ select max(カラムC) from テーブルa
104
+
105
+ where カラムA=a.カラムA
106
+
107
+ and カラムC<=TO_DATE('20180930','YYYYMMDD')
108
+
109
+ and カラムD>=TO_DATE('20180901','YYYYMMDD')
110
+
111
+ )
112
+
113
+ and b.カラムC = (
114
+
115
+ select max(カラムC) from テーブルb
116
+
117
+ where カラムA=b.カラムA
118
+
119
+ and カラムC<='20180930'
120
+
121
+ and カラムD>='20180901'
122
+
123
+ )
124
+
125
+ ```
126
+
127
+ こっちだと、
128
+
129
+ > --サブクエリー用
130
+
131
+ > a.カラムA, a.カラムC, a.カラムD
132
+
133
+ > b.カラムA, b.カラムC, b.カラムD
134
+
135
+ > --メイン用
136
+
137
+ > a.カラムB, a.カラムA, a.カラムC
138
+
139
+ > b.カラムB, b.カラムA, b.カラムC