ビュー(インラインビュー)で集約した結果と結合するSQLについて
テーブルAを複数のキー項目で集約した結果と、テーブルBを結合しようとしています。
インラインビュー(もしくはビュー)で予め集約を行う、以下のようなSQLを考えました。
候補<1> MAX関数でTableA.列1を絞る
select ...
from (select max(列1),列2,列3,列4 from TableA group by 列2,列3,列4) TableA2,Table_B
where TableA.列2=TableB.列2
and ...;
候補<2> ROW_NUMBER関数で列1の順位を取得し、Where句で順位=1とすることでTableA.列1を絞る
select ...
from (select 列2,列3,列4 from TableA group by 列2,列3,列4
row_number() over (partition by 列2,列3,列4 order by 列1) RN) TableA2,Table_B
where TableA.列2=TableB.列2
and ...
and RN=1;
※候補<1><2>で結果が異なることがありますが、ともかく
「インラインビュー(もしくはビュー)で予め集約を行う」がやりたいことです。
しかしこのようなクエリだと、インラインビューでもビューでも、
性能がでません。実行計画を確認したところ、TableA,TableBの結合で生成される
レコードごとに毎回集約を行っているようで、膨大なクエリ数が発生していました。
ビューやインラインビューで上記のように集約を行うと危険、とはよく聞きますが...
ビューやインラインビューで集約した結果をひとつのテーブルとみなして結合するなど、
レコードごとに集約を行わないようなノウハウがありましたら、お教え願います。
お礼
イエス! グループ句はいらないのですかね! ありがとうございました。