web-dev-qa-db-ja.com

Oracle 11g SQLでサブクエリにエイリアスを与える方法はありますか?

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;
17
Matt Pascoe

クエリにCTE(Common Table Expressions)、別名WITH句(別名Oracle)を使用して、クエリに名前またはエイリアスをサブクエリファクタリングとして指定できます。

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;
25
jmoreno

テストするOracleインスタンスはありませんが、投稿したものは有効なANSI-89 JOIN構文である必要があります。これは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
5
OMG Ponies

クエリは問題ないはずです。

別の方法は次のとおりです。

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がクエリを書き直したとしても、私は驚かないでしょう。

3
Jeffrey Kemp