2013-06-14 20 views
7

Şimdi birkaç gün boyunca beni boggled bir soru ve arandı ve arandı ama inandırıcı bir cevap bulamadı!2 Aynı Masadaki Dış Bağlantılar?

Basit bir soru, neden SQL'de 2 Dış Bağlantıya sahip olmakla sınırlıdır, farklı sütunlar kullanıldığında bile aynı tabloda, daha iyi anlamak için aşağıdaki sorguları kontrol edin. Ayrıca iç içe geçmiş alt sorgu veya ANSI birleşimlerini kullanarak bunları üstesinden gelebilirim, ancak (+) operatörünü kullanarak neden ilk etapta kısıtlanmış olsa bile! Ben hata bahsediyorum Bu soruda

:

Neden bu:

Ne sormak istiyorum şudur: "ORA-01417 bir tablo dış olabilecek en azından bir başka masaya katıldı"

select * from 
a, b, c 
where a.a1 = b.b1 
and a.a2 = c.c1 

Ve neden bu izin verilmez: izin verilir

select * from 
a, b, c 
where a.a1(+) = b.b1 
and a.a2(+) = c.c1 

bırakınız ANSI ve yalnız kısıtlama Oracle belgelerinde açıklanan

+6

yapmanız çalışıyoruz dair bir örnek kaynağı? Sen ('iç' veya' dış') aynı masaya katılmak mümkün olmalıdır ... – sgeddes

+2

Sgeddes'in dediği gibi, muhtemelen kafanız karışmış durumda. Oracle – Lamak

+2

'da "2 Dış Birleşme" sınırı yok. ORA-01417'ye atıfta bulunuyorsunuz: Bir tablo en fazla bir tabloya eklenmiş olabilir? –

cevap

10

iç içe subqueries: Outer Joins

Oracle operatörü katılmak fıkra dıştan kullanmak Oracle yerine sözdizimi JOIN önerir. Dış Oracle operatörü (+) katılmak kullanmak fıkra OUTER GELEN için geçerli değildir aşağıdaki kurallara ve kısıtlamalara, tabi sözdizimi JOIN sorguları katılmak: Bir sorguda

...

o ikiden fazla tablo çiftinin dış birleşimlerini gerçekleştirir, tek bir tablo sadece bir tablo için sıfırdan oluşturulmuş tablo olabilir. Bu nedenle (+) operatörünü A ve B için birleştirme koşulunda B sütunlarına ve B ve C için birleştirme koşuluna uygulayamazsınız. Bir dış birleştirmenin sözdizimi için SELECT'e bakın.

--- Query 1 --- 
    a 
RIGHT JOIN b 
    ON a.x = b.x 
RIGHT JOIN c 
    ON a.y = c.y 

ya:

--- Query 1b --- 
    c 
LEFT JOIN 
    b LEFT JOIN a 
     ON a.x = b.x 
    ON a.y = c.y 
ANSI/ISO mükemmel geçerli olanı eski (+) sözdizimi ile olamaz temelde (ANSI/ISO sözdizimi açıklanmaktadır) demektir

Bu, eski Oracle sözdiziminin birçok kısıtlamalarından yalnızca biridir.


bu sınırlamayı nedenleri gelince, uygulama detayları ve/veya bu tür katılır ikianlamlılığı olabilir. Yukarıdaki iki katılır% 100 eşdeğerdir, aşağıdaki iki yukarıdaki eşdeğer değildir:

--- Query 2 --- 
    a 
RIGHT JOIN c 
    ON a.y = c.y 
RIGHT JOIN b 
    ON a.x = b.x 

SQL-Fiddle testi bakınız. Yani soru ortaya çıkıyor. Özel katılımın sorgu 1 veya 2 olarak nasıl yorumlanması gerekir?Bir tablo (2 veya daha fazla), dış katılır sol tarafında görünürse

FROM a, b, c 
WHERE a.y (+) = c.y 
    AND a.x (+) = b.x 

herhangi bir kısıtlama yoktur. Bunlar hatta eski sözdizimi ile mükemmel geçerlidir:

FROM a 
    LEFT JOIN b ON a.x = b.x 
  LEFT JOIN c ON a.y = c.y 
    ... 
    LEFT JOIN z ON a.q = z.q 

FROM a, b, ..., z 
WHERE a.x = b.x (+) 
  AND a.y = c.y (+) 
    ... 
    AND a.q = z.q (+) 
+0

Güzel açıklama. –

+0

Bu kısıtlama şu anda 12c'de saklanmış görünüyor. –

+0

@shonkylinuxuser Link to this Eski sözdiziminin desteğini kaldıracaklarını, geliştirmeyeceklerini düşünürdüm. –

İlgili konular