2010-06-16 31 views
13

Oracle 11g'de bir alt sorgu vermenin bir yolu var mıdır?Oracle 11g SQL'de bir alt soruyu bir takma ad vermek için bir yol var mı?

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; 

Aksi takdirde, client_ref_id temelinde iki alt sorgunun birleştirilmesi için bir yol var. Kendi kendine birleşme olduğunu anlıyorum, ama veritabanı üzerinde ben kendi kendine birleştirme üzerinde koşuyorum tamamlamak için 5 dakikaya kadar sürebilir (çalıştığım gerçek sorguda bazı ekstra mantık var ama ben kendi kendine katılma olduğunu belirledim ne olduğunu soruna neden olmak). Tek tek alt sorguların sadece kendileri tarafından tamamlanmaları birkaç saniye sürüyor. Kendi kendine katılma sorguları şöyle bir şey gibi görünür:

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

Sadece merak, kabul edilen cevap ne kadar iyi performans gösterdi? – DCookie

+1

Bunun kendi kendine katılma olduğunu anlayamadınız. Tablo, indeksler ve istatistiklerin aynı bir kopyasını yapın ve aynı zamanlamayı alıp almadığınızı görün. Daha iyi bir soru, "Bu sorguyu ayarlamanıza yardımcı ol" olurdu ve FULL sorgusu ile açıklama planını yayınladı. –

cevap

16
 
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; 
+0

"WITH abc as (select ...)" parçası için teknik terim nedir? Birisi yeteneklerini araştırmak istiyorsa. – SeaBass

+2

@SeaBass: Sık sık CTE'ye kısaltılmış olan Ortak Tablo İfadeleri (aynı zamanda bu kez yapmadığım halde ad/takma ad olarak da sıklıkla kullanılır). Her iki "tablonun" CTE'nin bir parçası olarak yapılmış olabileceğini unutmayın, sadece iki seçeneği de göstermek istedim, yani bir tane diğeri diğeriydi. – jmoreno

5

ancak geçerli olmalıdır ne yayınlanmıştır ANSI-89 sözdizimi JOIN. Burada ANSI-92:

3

Sorunuz iyi olmalıdır.

alternatif olacaktır: Plan neyse aynı olacak şekilde Oracle sorguları yeniden yazdım eğer

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; 

ben şaşırmam.

+0

Bu çözüm, kullandığım veritabanında tamamlanması uzun süren işlem. 'Abc.client_ref_id = def.client_ref_id' ifadesi, sorgunun tamamlanması için bir saatten daha uzun bir süre geçmesine neden oluyor. –

+0

Zamanlama konusunda çok dikkatli olmalısınız. Son sıra zamanlaması hakkında mı konuşuyorsun? ya da sadece ilk satırlar? Bazı sorgu planları 1 satır çok hızlı (bir saniye) üretebilir, ancak son satırı üretmek için bir yıl sürebilir. Diğerleri ise bir dakika içinde son satırı alacaktır. –

+0

@Matt, sorgu planını yayınla - performans konusuna neyin neden olduğunu bilmediğimizde SQL ile uğraşmak iyi bir şey değil. –

İlgili konular