هل هناك طريقة لإعطاء استعلام فرعي اسم مستعار في Oracle 11G SQL؟

StackOverflow https://stackoverflow.com/questions/3057930

سؤال

هل هناك طريقة لإعطاء مسمة فرعية في 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 دقائق لإكماله (هناك بعض المنطق الإضافي في الاستعلام الفعلي الذي أقوم بتشغيله ، لكنني حددت أن الانضمام الذاتي هو ما هو تسبب القضية). لا تستغرق الفخذيين الفرعية الفردية بضع ثوانٍ فقط لإكمالهم. يبدو استعلام Join Self شيء مثل:

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;

نصائح أخرى

ليس لدي مثيل Oracle للاختبار معه ، ولكن يجب أن يكون ما نشرته ساري المفعول ANSI-89 Syntax. هنا في 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

يجب أن يكون استعلامك على ما يرام.

سيكون بديل:

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 كتابة الاستعلامات بحيث تكون الخطة هي نفسها على أي حال.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top