Есть ли способ дать подзапросу псевдоним в Oracle 11g SQL? - PullRequest
14 голосов
/ 17 июня 2010

Есть ли способ дать подзапросу в 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.Я понимаю, что есть самообъединение, но в базе данных, в которой я работаю, самообъединение может занять до 5 минут (в реальном запросе, который я выполняю, есть дополнительная логика, но я определил, чтовызывая проблему).Отдельные подзапросы занимают всего несколько секунд.Запрос на самостоятельное соединение выглядит примерно так:

select st.request, st1.request
from
    some_table st, some_table st1
where 
    st.client_ref_id = st1.client_ref_id;

Ответы [ 3 ]

21 голосов
/ 17 июня 2010
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;
5 голосов
/ 17 июня 2010

У меня нет экземпляра 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
3 голосов
/ 17 июня 2010

Ваш запрос должен быть в порядке.

Альтернативой может быть:

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 переписал запросы так, чтобы план в любом случае был таким же.

...