こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

1SQLで書けないものでしょうか

初めて投稿します。
よろしくお願いします。

現状、下記の様な構成のテーブルがあります。
DB :oracle9iR2
テーブル名:test
名前 型
------- -------------
key_data VARCHAR2(10)
rireki DATE
read_data VARCHAR2(10)
プライマリキーは、key_dataとrirekiです。

この、データの中から、key_data毎に最新のrirekiの情報だけを
取得したいと考えています。

そこで、下記の様にクエリーを組んでいたのですが、

select
key_data,
rireki,
read_data
from test
inner join (
select
key_data,
max(rireki) AS rireki
from test
group by key_data
) test2
on (test.key_data = test2.key_data and test.rireki = test2.rireki)

複数のテーブルが、上記の様なキー項目と履歴を持つ形で
構成されている為に、複数のテーブルを結合すると途端に
パフォーマンスが落ちて困っています。
ひょっとしたら、oracleなら分析関数か何かで1SQLで書けないものか
(それで、処理速度が向上出来れば)と云うことで、自分で調べて
みましたが、良い方法が見つかりません。
同様のお悩みをもたれた方で、対処法がありましたら教えていただけると幸いです。
よろしくお願いいたします。

投稿日時 - 2005-11-29 09:17:07

QNo.1808333

すぐに回答ほしいです

質問者が選んだベストアンサー

分析関数での実現例:

select key_data,rireki,read_data
from
(select x.*,rank() over(partition by key_data order by rireki desc) R from test)
where R=1;

分析関数を使わない実現例:

select * from test
where (key_data,rireki) in (select key_data,max(rireki) from test group by key_data);

あなたのSQLも含めて、それぞれの実行計画を比較すると
面白いと思いますよ。

投稿日時 - 2005-11-29 10:36:14

補足

ありがとうございます。
SQL見て、rankが利用できる事がわかりました。
ただ、rankを使用しても、fromに書かないとwhereできないんですね。

ところで、勉強不足ですみませんが、fromに副問合わせするのと、
同じテーブルをjoinするのとどちらが一般的に早いんでしょうか?
#その為の実行計画って指摘を受けそうですが、PLAN_TABLEもSYS権限も
#無いため、比較が出来ないでいます。
実際に走らせた比較ですと、どれも大きく速度差が見られない様子でしたので。
すみません、ご教授頂ければ幸いです。

投稿日時 - 2005-11-29 11:42:54

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.3

このようなのではどうか?

SELECT A.KEY_DATA,
A.RIREKI,
A.READ_DATA
FROM TEST A
WHERE A.RIREKI = ( SELECT MAX(B.RIREKI)
FROM TEST B
WHERE B.KEY_DATA = A.KEY_DATA);

投稿日時 - 2005-11-30 19:14:03

実行計画無しで、処理効率を追求することは不可能です。
SYS権限でないと実行計画がとれない訳ではないですが・・
実行計画をとれないということであれば、トライ&エラーを
繰り返すしかないかと思いますよ。
(少ないとも、”こうすれば”絶対速くなるという王道はありませんので。)

>どちらが一般的に早いんでしょうか?

オプティマイザの判断次第です。
オプティマイザがどのような判断をしたのかが、実行計画で確認できます。

投稿日時 - 2005-11-29 13:30:37

あなたにオススメの質問