Oracle “(+)” Operatörü


155

Bazı eski SQL ifadelerini belgelemek ve muhtemelen geliştirmek amacıyla kontrol ediyorum.

DBMS Oracle

Ben böyle okumak bir ifade anlamadım:

select ...
from a,b
where a.id=b.id(+)

(+)Operatör hakkında kafam karıştı ve herhangi bir forumda alamadım ... (tırnak içinde + için arama da işe yaramadı).

Her neyse, SQLDeveloper 'Açıklamak Planı' kullandım ve bunu söyleyerek bir çıktı var HASH JOIN, RIGHT OUTER, vb.

(+)Sorgunun sonunda operatörü kaldırırsam herhangi bir fark olur mu? Veritabanı önce (bazı endeksler, vb olması gibi) bazı koşulu da yerine getirmek zorunda mı (+)kullanılabilir ?? Bana basit bir anlayış ya da bu konuda okuyabileceğim iyi bağlantılar sağlayabiliyorsanız çok yardımcı olacaktır.

Teşekkürler!


1
Bir operatör değil. Bu sadece JOIN'in yaptıklarını etkileyen bir sözdizimi parçasıdır.
philipxy

Yanıtlar:


187

Bu ANER-89 biçimi (tablo referanslarını ayırmak için FROM yan tümcesinde virgül kullanarak) OUTER birleşimlerini standart hale getirmediğinden, bu, OUTER JOIN için Oracle'a özgü bir gösterimdir.

Sorgu ANSI-92 sözdiziminde şu şekilde yeniden yazılır:

   SELECT ...
     FROM a
LEFT JOIN b ON b.id = a.id

Bu bağlantı JOIN'ler arasındaki farkı açıklamada oldukça iyidir .


Ayrıca olsa bile unutulmamalıdır (+)eserler, Oracle önerir değil kullanmaktan :

Oracle , Oracle birleştirme işleci yerine FROMyan tümce OUTER JOINsözdizimini kullanmanızı önerir . Oracle join işlecini kullanan dış birleştirme sorguları (+), FROMyan tümce OUTER JOINsözdizimi için geçerli olmayan aşağıdaki kurallara ve kısıtlamalara tabidir :


79
Kesinlikle doğru. (+) 'I kafamda düz tutmak için (sol taraf ve sağ taraf), (+)' ı "Eşleşme bulunamazsa NULL değerler eklemek" olarak düşünmeyi seviyorum. Örneğin, "a.id = b.id (+)", a.id ile eşleşme yoksa b.id öğesinin NULL olmasına izin ver anlamına gelir.
plaj

teşekkürler ... sanırım yan tümcesinden ekleyerek aynı sonucu vermelidir !!
Kiran S

Resmi Oracle belgelerinde bir bağlantıya sahip olmak isteyebilirsiniz: docs.oracle.com/html/A95915_01/sqopr.htm
Vargan

27

(+) Operatörü bir dış birleşmeyi gösterir. Bu, Oracle'ın eşleşme olmasa bile birleştirmenin diğer tarafından kayıtları döndüreceği anlamına gelir. Örneğin a ve b emp ve borçsa ve bir departmana atanmamış çalışanlarınız varsa, aşağıdaki ifade bir departmana atanmış olsun veya olmasın tüm çalışanların ayrıntılarını döndürür.

select * from emp, dept where emp.dept_id=dept.dept_id(+)

Kısacası, (+) işaretinin kaldırılması önemli bir fark yaratabilir, ancak verilerinize bağlı olarak bir süre fark etmeyebilirsiniz!


25

Oracle'da, (+) JOIN içindeki "isteğe bağlı" tabloyu belirtir. Yani sorgunuzda,

SELECT a.id, b.id, a.col_2, b.col_2, ...
FROM a,b
WHERE a.id=b.id(+)

'b' tablosunun 'a' tablosuna SOL DIŞ BİR birleşimidir. Diğer tarafta (isteğe bağlı 'b' tablosu) veri yoksa, 'a' tablosunun tüm verilerini verilerini kaybetmeden döndürür.

Sol Dış Birleştirme Diyagramı

Aynı sorgu için modern standart sözdizimi

SELECT  a.id, b.id, a.col_2, b.col_2, ...
FROM a
LEFT JOIN b ON a.id=b.id

veya kısayoluyla a.id=b.id(tüm veritabanları tarafından desteklenmez):

SELECT  a.id, b.id, a.col_2, b.col_2, ...
FROM a
LEFT JOIN b USING(id)

(+) Öğesini kaldırırsanız normal iç birleşim sorgusu olur

Hem Oracle hem de diğer veritabanlarında daha eski sözdizimi:

SELECT  a.id, b.id, a.col_2, b.col_2, ...
FROM a,b
WHERE a.id=b.id

Daha modern sözdizimi:

SELECT  a.id, b.id, a.col_2, b.col_2, ...
FROM a
INNER JOIN b ON a.id=b.id

Ya da sadece:

SELECT  a.id, b.id, a.col_2, b.col_2, ...
FROM a
JOIN b ON a.id=b.id

İç Birleştirme Diyagramı

Yalnızca 'a' & 'b' tabloları 'id' değerinin aynı olduğu tüm verileri döndürür, ortak kısım anlamına gelir.

Sorgunuzu bir Doğru Katılma yapmak istiyorsanız

Bu, SOL BİRLEŞME ile aynıdır, ancak hangi tablonun isteğe bağlı olduğunu değiştirir.

Sağ Dış Birleştirme Diyagramı

Eski Oracle sözdizimi:

SELECT  a.id, b.id, a.col_2, b.col_2, ...
FROM a,b
WHERE a.id(+)=b.id

Modern standart sözdizimi:

SELECT  a.id, b.id, a.col_2, b.col_2, ...
FROM a
RIGHT JOIN b ON a.id=b.id

Ref ve yardım:

https://asktom.oracle.com/pls/asktom/f?p=100:11:::::P11_QUESTION_ID:6585774577187

Oracle 11g'de + işaretini kullanarak Sol Dış Katılma

https://www.w3schools.com/sql/sql_join_left.asp


"Table1" ve "table2" daire etiketleri saçmalıktır. Daire elemanları için en basit anlam çıktı satırlarıdır. Daha sonra sol hilal, tablo1'in null genişletilmiş satırlarını ve sağ hilal tablo2'nin null genişletilmiş satırlarını içerir. Daireler için diğer anlamlar belirsizdir. Diyagramların tam olarak ne anlama geldiğini düşünüyorsunuz? Neden onları diğer insanların (kötü) sunumlarını körü körüne kopyalamaktan başka bir yere koydunuz?
philipxy

Şimdi a & b çemberlerini etiketlediniz. Daireler a & b satırları değildir. Sol ve sağ daireler makul bir şekilde sol birleştirme b ve sağ birleştirme b satırları olarak etiketlenebilir. Dahası, çevrili olan bu satırların girdi açısından ne olduğunu tanımlamazsınız. Çevrelerde neler olduğunu kendiniz halledin. A ve b etiketlerini dairelere yapıştıracaksanız, her bir etiketin dairesi ile ne ilgisi olduğunu açık bir şekilde kelimelerle açıklayın. (Onları a & b olarak etiketlemenin açık bir nedeni yoktur.) Yeşil bölgeleri doğru şekilde etiketlemeniz iyi bir şey.
philipxy

6

Uygulamada, + sembolü doğrudan koşullu ifadeye ve isteğe bağlı tablonun (koşul içinde boş veya boş değerler içermesine izin verilen) yanına yerleştirilir.


(+) Hemen bir sütun adının sağına konur. Bu cevap bu konuda net değil. "Uygulamada" ne anlama geliyor? (Retorik.) (Ve muhtemelen "ifade" demek istemiyorsun.)
philipxy
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.