Gibt es eine Möglichkeit, eine Unterabfrage einen Aliasnamen in Oracle 11g SQL zu geben?
-
27-09-2019 - |
Frage
Gibt es eine Möglichkeit, eine Unterabfrage in Oracle 11g einen Aliasnamen zu geben, wie:
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;
Ansonsten ist es eine Möglichkeit, die beiden Unterabfragen zu verbinden auf der client_ref_id basiert. Ich weiß, es ist ein Selbst beitreten, aber auf der Datenbank, die ich auf einem selbst leite beitreten kann bis zu 5 Minuten in Anspruch nehmen (es gibt einige zusätzliche Logik in der aktuellen Abfrage bei mir läuft, aber ich habe das selbst bestimmt kommen wird, was das Problem verursacht). Die einzelnen Unterabfragen nehmen nur wenige Sekunden von ihnen selbst zu vollenden. Die Self-Join-Abfrage sieht so etwas wie:
select st.request, st1.request
from
some_table st, some_table st1
where
st.client_ref_id = st1.client_ref_id;
Lösung
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;
Andere Tipps
Ich habe nicht eine Oracle-Instanz Test haben mit, aber was Sie auf dem Laufenden gültige ANSI-89 JOIN-Syntax sein sollte. Hier ist es in 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
Ihre Abfrage sollte in Ordnung sein.
Eine Alternative wäre:
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;
ich würde nicht überrascht sein, wenn Oracle die Abfragen neu geschrieben, so dass der Plan die gleichen ohnehin sei.