21

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;
4

4 に答える 4

29

サブクエリファクタリングとして、CTE(共通テーブル式)(別名WITH句)を使用して、クエリに名前またはエイリアスを付けることができます。

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;
于 2010-06-17T04:49:52.343 に答える
7

テストするOracleインスタンスはありませんが、投稿した内容は有効なANSI-89JOIN構文である必要があります。これは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
于 2010-06-16T23:40:02.673 に答える
3

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

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

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

于 2010-06-17T01:21:00.693 に答える
0

SQL標準では、この方法でサブクエリのエイリアスを定義できます

SELECT Temp.patente, Temp.SalarioProm
FROM ( SELECT A.aid aid, A.patente AS Patente,
AVG (E.esalario) AS SalarioProm
FROM Aircraft A, Certified C, Employees E
WHERE A.aid = C.aid
AND C. eid = E.eid
AND A.rangocrucero > 1000
GROUP BY A.aid, A.patente ) AS Temp

Temp はサブクエリのエイリアスです

Oracle では、特にサブクエリが複雑で大量の一時領域を使用する場合に、WITH 句を使用できます。

Oracle では、次の構文は正常に機能します。

SELECT Temp.patente, Temp.SalarioProm
FROM ( SELECT A.aid aid, A.patente AS Patente,
AVG (E.esalario) AS SalarioProm
FROM Aircraft A, Certified C, Employees E
WHERE A.aid = C.aid
AND C. eid = E.eid
AND A.rangocrucero > 1000
GROUP BY A.aid, A.patente ) Temp

于 2021-11-01T13:00:21.183 に答える