SubqueryにOracle 11g SQLのエイリアスを提供する方法はありますか?
-
27-09-2019 - |
質問
Oracle 11gのサブクエリに次のようなエイリアスを与える方法はありますか?
select *
from
(select client_ref_id, request from some_table where message_type = 1) abc,
(select client_ref_id, response from some_table where message_type = 2) defg
where
abc.client_ref_id = def.client_ref_id;
それ以外の場合は、client_ref_idに基づいて2つのサブ征服に参加する方法があります。セルフ結合があることに気付きましたが、データベースで私が自己結合で実行していることで、最大5分かかることがあります(実行中の実際のクエリには余分なロジックがありますが、セルフ結合は何であるかを判断しました問題を引き起こす)。個々のサブ征服は、自分自身で完了するのに数秒しかかかりません。セルフ参加クエリは次のようになります:
select st.request, st1.request
from
some_table st, some_table st1
where
st.client_ref_id = st1.client_ref_id;
解決
WITH abc as (select client_ref_id, request from some_table where message_type = 1) select * from abc inner join (select client_ref_id, response from some_table where message_type = 2) defg on abc.client_ref_id = def.client_ref_id;
他のヒント
テストするOracleインスタンスはありませんが、投稿したものは有効なANSI-89結合構文である必要があります。ここにANSI-92にあります:
SELECT *
FROM (SELECT client_ref_id, request
FROM SOME_TABLE
WHERE message_type = 1) abc
JOIN (SELECT client_ref_id, request
FROM SOME_TABLE
WHERE message_type = 1) defg ON defg.client_ref_id = abc.client_ref_id
あなたのクエリは大丈夫なはずです。
別の方法は次のとおりです。
select abc.client_ref_id, abc.request, def.response
from some_table abc,
some_table def
where abc.client_ref_id = def.client_ref_id
and abc.message_type = 1
and def.message_type = 2;
とにかく計画が同じになるように、Oracleがクエリを書き直しても驚かないでしょう。
所属していません StackOverflow