Есть ли способ дать подзапрос в Oracle 11 г за псевдоним как:
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;
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;
С вашим запросом все в порядке.
Альтернативой может быть:
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 переписывает запросы так, чтобы план в любом случае остался прежним.
У меня нет экземпляра 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