SQL Server'da LEFT JOIN ve LEFT OUTER JOIN


1595

Arasındaki fark nedir LEFT JOINve LEFT OUTER JOIN?


213
Yok! OUTERAnahtar kelime isteğe bağlıdır.
jarlh

9
Venn diyagramları bu sorunun cevapları için uygun değildir. Bu sorunun cevabı Yok'tur . İlk yoruma bakın.
philipxy

3
Venn diyagramları , iç ve dış birleşimlerin özel durumları için çıkış sıralarındaki farkı gösterir . Hiçbir boş değer veya yinelenen satır girilmezse (tabloyu satır değerli değerler kümesi olarak alabilir ve normal matematik eşitliğini kullanabiliriz), sol ve sağ daireler çıktı tablolarını / sol ve sağ birleşim kümelerini tutar . Ancak null'ler veya yinelenen satırlar girilirse, dairelerin kümelerinin ne olduğunu ve bu kümelerin Venn diyagramlarının yardımcı olmadığı girdi ve çıktı tabloları / torbalarıyla nasıl ilişkili olduğunu açıklamak çok zordur. Diğer Venn şeması kötüye kullanımlarıyla ilgili yorumlarıma bakın.
philipxy

Yanıtlar:


2237

Belgelere göre: FROM (Transact-SQL) :

<join_type> ::= 
    [ { INNER | { { LEFT | RIGHT | FULL } [ OUTER ] } } [ <join_hint> ] ]
    JOIN

Anahtar kelime OUTERisteğe bağlı olarak işaretlenmiştir (köşeli parantez içine alınmıştır). Bu özel durumda, belirtip belirtmemeniz OUTERfark etmez. Diğer unsurları maddesini katılmak ederken aynı zamanda, isteğe bağlı olarak işaretlenmiş ayrılacağını Not onları dışarı irade bir fark yaratır.

Örneğin, JOINcümlenin tüm tip kısmı isteğe bağlıdır, bu durumda INNERyalnızca belirtmeniz durumunda varsayılan değerdir JOIN. Başka bir deyişle, bu yasaldır:

SELECT *
FROM A JOIN B ON A.X = B.Y

Eşdeğer sözdizimlerinin listesi:

A LEFT JOIN B            A LEFT OUTER JOIN B
A RIGHT JOIN B           A RIGHT OUTER JOIN B
A FULL JOIN B            A FULL OUTER JOIN B
A INNER JOIN B           A JOIN B

Ayrıca bu diğer SO soru sol cevap bir göz atın: SQL sol FROM satırında birden fazla tablo vs katılmak? .

resim açıklamasını buraya girin


135
Kesinlikle doğru. ANSI-92 uyumluluğu için OUTER'a izin verildi.
Sean Reilly

11
@ LasseV.Karlsen , eşdeğerler listesinde INNER JOINsağda ve JOINsolda olmak daha iyi olmaz mıydı ?
nawfal

8
@ LasseV.Karlsen Sadece sol tarafın özlü bir form ve sağ tarafın genişletilmiş formda olduğunu kastediyorum. Aynı şeyi JOINs için de takip etmenizin tutarlı olacağını düşündüm .
nawfal

30
@Outlier Bu senin ayrıcalığın, ama açıkça 451 kişi cevabın iyi olduğunu düşündü. Dürüst olmak gerekirse, bir cevap X ve başka bir cevap X diyor ve dokümantasyona atıfta bulunuyorsa ve dokümantasyonun ilgili parçalarını cevaba kopyalarsa, oyum ikinci cevaba gider ve bu yüzden cevaplarımı bu şekilde yazarım Yaparım. Birinin X'in iyi olmadığını iddia etmesi . Eğer Eğer ispat (hafif sactiw cevabı verilmez) iyidir X,. Ama, ne istersen düşünmek senin ayrıcalığın. Neden anlamsız olduğunu düşündüğünüzü soruyorum, cevap herhangi bir şekilde yanlış mı?
Lasse V. Karlsen

7
@Daha fazla Ve dürüst olmak gerekirse, "uzun" cevaplarımı okumak istemiyorsanız, cevabım sizin için değildi. Buraya gelen herkes için aynı şeyi merak ediyor ve bunun nedenini ve nerede daha fazla bilgi bulabileceğinizi vb. Biraz arka plan istiyor. Açıkçası bu cevabı isteyecek türden birisiniz: "Yok", ama ne yazık ki bu burada Stack Overflow'da yasal bir cevap değil.
Lasse V. Karlsen

700

Sorunuzu cevaplamak için LEFT JOIN ve LEFT OUTER JOIN arasında hiçbir fark yoktur, bunlar tamamen aynıdır ...

En üst düzeyde temel olarak 3 tip birleşim vardır:

  1. İÇ
  2. DIŞ
  3. ÇAPRAZ

  1. INNER JOIN - her iki tabloda da varsa verileri getirir.

  2. DIŞ artır vardır 3 tip:

    1. LEFT OUTER JOIN - sol tabloda mevcutsa verileri getirir.
    2. RIGHT OUTER JOIN - sağ tabloda varsa verileri getirir.
    3. FULL OUTER JOIN - iki tablodan birinde varsa verileri getirir.
  3. CROSS JOIN , adından da anlaşılacağı gibi, [n X m]bu her şeyi her şeye katıyor.
    Birleştirme için tabloları ( ifadenin FROMyan tümcesinde SELECT), ayırmak için virgül kullanarak listelediğimiz senaryoya benzer .


Dikkat edilmesi gereken hususlar:

  • Sadece bahsederseniz JOIN, varsayılan olarak birINNER JOIN .
  • Bir OUTERkatılmak olmalı LEFT| RIGHT| FULLsadece söyleyemezsinOUTER JOIN .
  • Sen bırak OUTERkelime ve sadece söylemek LEFT JOINya RIGHT JOINya FULL JOIN.

Bunları daha iyi bir şekilde görselleştirmek isteyenler için lütfen şu bağlantıya gidin: SQL Birleşimlerinin Görsel Açıklaması


17
Çok iyi bir cevap. "SOL DIŞ BİRLEŞTİR - sol tablodaki tüm verileri, önceden ayarlanmışsa, eşleşen verilerle sağdan getirir" derseniz daha açık olacaktır. 2.1 için (ve 2.2 için benzer değişiklik)
ssh

1
Ayrıca basitçe 'TableA,
TableB'den

3
Ben nekrobumping ise üzgünüm ama CROSS JOINaynı FULL JOINmı?
TechnicalTophat

9
@RhysO hayır, CROSS JOIN, kartezyen bir üründür, yani bir tablonun CROSS JOIN'i, n satırı olan, bir tablo ile, m satırı olan, her zaman (n * m) satır verirken, bir tablonun TAM DIŞ ORTASI, n satırı olan, bir tablo ile, m satırları, maksimum (n + m) satır verir
sactiw

1
@sactiw Cross Joinve arasındaki farkla ilgili değerli cevabınıza özel bir not eklemeyi düşünün Full Outer Join... bir şekilde benzer görünüyor.
Manuel Ürdün

356

Sol birleşim ve sol dış birleşim arasındaki fark nedir?

Hiçbir şey . LEFT JOINve LEFT OUTER JOINeşdeğerdir.


13
erm merhaba! bunu kim oyladı? LEFT JOIN, LEFT OUTER JOIN ile aynıdır.
Mitch Wheat

7
Bu, Microsoft SQL Server ve diğer SQL uyumlu RDBMS'de geçerlidir.
Bill Karwin

7
Neden OUTERisteğe bağlı olduğu hakkında bir referans veya açıklama eklerseniz iyi olur .
Sıfır3

7
En özlü, doğru cevap burada.
Manachi

4
Teşekkür ederim. Kabul edilen cevabın çok fazla bilgiye sahip olması beni daha karışık hale getirdi. Orijinal soruyu doğrudan bilmesi gereken ve cevapladığım şey tam olarak bu.
Bacon Brad

66

Ben bir PostgreSQL DBA, dış ya da değil dış birleşimler arasındaki farkı anlayabildiğim kadarıyla tüm internet çevresinde önemli bir tartışma var bir konu. Bugüne kadar bu ikisi arasında hiç fark görmedim; Bu yüzden daha ileri gittim ve aralarındaki farkı bulmaya çalışıyorum. Sonunda bununla ilgili tüm belgeleri okudum ve bunun cevabını buldum,

Yani belgelere bakarsanız (en azından PostgreSQL'de) bu ifadeyi bulabilirsiniz:

"Kelimeleri INNERve OUTER. Her türlü isteğe bağlıdır INNER; varsayılan edilir LEFT, RIGHTve FULLbir dış birleşim ima."

Diğer bir deyişle,

LEFT JOINve LEFT OUTER JOINAYNI

RIGHT JOIN ve RIGHT OUTER JOINAYNI

Umarım hala cevabı bulmaya çalışanlar için bir katkı olabilir.


60

Left Joinve Left Outer Joinbir ve vardır aynı . Birincisi, ikincisinin kısayoludur. Aynı şey ilişki Right Joinve Right Outer Joinilişki için de söylenebilir . Gösteri eşitliği gösterecek. Her bir sorgunun çalışma örnekleri SQL Fiddle ile sağlanmıştır . Bu araç, sorgunun manipüle edilmesine izin verecektir.

verilmiş

resim açıklamasını buraya girin

Sol Bağlantı ve Sol Dış Bağlantı

resim açıklamasını buraya girin

Sonuçlar

resim açıklamasını buraya girin


Doğru Birleştirme ve Doğru Birleştirme

resim açıklamasını buraya girin

Sonuçlar

resim açıklamasını buraya girin


43

Joins'i aşağıdaki sırayla düşünmeyi daha kolay buluyorum:

  • CROSS JOIN - her iki tablonun kartezyen ürünü. TÜM katılımlar burada başlıyor
  • INNER JOIN - filtre eklenmiş bir CROSS JOIN.
  • OUTER JOIN - daha sonra eksik öğeler (SOL veya SAĞ tablodan) eklenmiş bir INNER JOIN.

Bu (nispeten) basit modeli anlayana kadar, JOINS her zaman biraz daha siyah bir sanattı. Şimdi tam mantıklı.

Umarım bu daha çok yardımcı olur.


Bu soruya cevap vermiyor.
philipxy

33

SOL / SAĞ ve SOL DIŞ / SAĞ DIŞ neden aynı? Neden bu kelimeyi açıklayalım. SOL ve SAĞ birleşimlerin OUTER birleşiminin özel durumları olduğunu ve bu nedenle DIŞ SOL / DIŞ SAĞ dışında bir şey olamayacağını anlayın. OUTER birleşimine, OUTER birleşiminin KISMİ sonuçları olan SOL ve SAĞ birleşimlerin yerine FULL OUTER da denir . Aslında:

Table A | Table B     Table A | Table B      Table A | Table B      Table A | Table B
   1    |   5            1    |   1             1    |   1             1    |   1
   2    |   1            2    |   2             2    |   2             2    |   2
   3    |   6            3    |  null           3    |  null           -    |   -
   4    |   2            4    |  null           4    |  null           -    |   -
                        null  |   5             -    |   -            null  |   5
                        null  |   6             -    |   -            null  |   6

                      OUTER JOIN (FULL)     LEFT OUTER (partial)   RIGHT OUTER (partial)

Bu operasyonların neden takma adları olduğu ve sadece 3 vakanın olduğu açık: INNER, OUTER, CROSS. OUTER için iki alt durumla. Kelime dağarcığı, öğretmenlerin bunu açıklama şekli ve yukarıdaki bazı cevaplar, çoğu zaman farklı türde katılımların varmış gibi görünmesini sağlar. Ama aslında çok basit.


1
“sadece 3 vakanın olduğu açıktır”: ilginç ama kusurlu. Bir iç birleşimin özel bir çapraz birleşim olduğunu düşünün (yani hareket birleşimi nerede cümlesine göre tahmin eder). Ayrıca, dış birleşmenin bir birleşim olmadığını, 'eksik' sütunlar yerine null'ların kullanıldığı bir birlik olduğunu düşünün. Bu nedenle, çaprazın gerekli olan tek birleşim olduğu söylenebilir. İlişkisel teorideki mevcut düşüncenin doğal birleştirmenin tüm birleştirme gereksinimlerini karşıladığına dikkat edin. Bir kenara: kelime dağarcığının "birleştirme" JOINanlamına gelip gelmediğini açıklayabilir misiniz INNER JOIN?
oneday6

27

Soruna cevap vermek için

Sql Server sözdiziminde OUTER isteğe bağlıdır

Msdn makalesinde bahsedilmiştir: https://msdn.microsoft.com/en-us/library/ms177634(v=sql.130).aspx

Aşağıdaki liste OUTER ile ve OUTER olmadan eşdeğer sözdizimlerini gösterir

LEFT OUTER JOIN => LEFT JOIN
RIGHT OUTER JOIN => RIGHT JOIN
FULL OUTER JOIN => FULL JOIN

Diğer eşdeğer sözdizimleri

INNER JOIN => JOIN
CROSS JOIN => ,

Dotnet Mob Artice: Sql Sunucusuna Katılır resim açıklamasını buraya girin


2
Venn şemalarının yeniden kötüye kullanımı burada soru hakkındaki yorumuma bakın.
philipxy

20

Sadece 3 katılım var:

  • A) Çapraz Birleşme = Kartezyen (Örn: Tablo A, Tablo B)
  • B) İç Birleştirme = BİRLEŞTİR (Örn: Tablo A Birleştirme / İç Birleştirme Tablosu B)
  • C) Dış birleşim:

       There are three type of outer join
       1)  Left Outer Join     = Left Join
       2)  Right Outer Join    = Right Join
       3)  Full Outer Join     = Full Join    

Umarım yardımcı olur.


1
Yani 5 tamamen katılıyor.
Zeek2

19

Esas olarak üç tip JOIN vardır

  1. İç: her iki tabloda da bulunan verileri getirir
    • Yalnızca JOIN, INNER JOIN anlamına gelir
  2. Dış: üç tiptir

    • SOL DIŞ - - sadece sol tabloda ve eşleştirme koşulunda mevcut olan verileri getirir
    • SAĞ DIŞ - - yalnızca sağ tabloda ve eşleşen durumda bulunan verileri getirir
    • FULL OUTER - - herhangi bir tabloyu veya her ikisini birden sunan verileri getirir
    • (SOL veya SAĞ veya TAM) DIŞ BAĞLANTI "DIŞ" yazılı olmadan yazılabilir
  3. Çapraz Katılım: her şeyi her şeye katıyor


16

Sözdizimsel şeker, sıradan okuyucu için birleştirmenin bir iç değil olduğunu daha açık hale getirir.


2
Peki ... O zaman TAM DIŞ BİRLEŞME nedir?
Amy B

5
tableA FULL OUTER JOIN tableB size üç tür kayıt verecektir: tableA'da eşleşen kayıt bulunmayan tableA'daki tüm kayıtlar, tableA'da eşleşen kayıt bulunmayan tableB'deki tüm kayıtlar ve tableA'daki eşleşen kayıtla tableA'daki tüm kayıtlar.
Dave DuPlantis

4

Sadece bu soru bağlamında, 2 'UYGULA' operatörünü de göndermek istiyorum:

KATILIR :

  1. INNER JOIN = KATIL

  2. DIŞ KATILIM

    • SOL İÇ GİRİŞ = SOL GİRİŞ

    • SAĞ DIŞ BİRLEŞTİR = SAĞ BİRLEŞTİR

    • TAM DIŞ ORTAK = FULL KATIL

  3. ÇAPRAZ KATIL

KENDİNİ KATILIN : Bu tam olarak ayrı bir birleştirme türü değildir. Bu, temel olarak yukarıdaki birleştirmelerden birini kullanarak bir tabloyu birleştirir. Ancak, bu terimi SQL Geliştirici topluluğundaki birçok kişiden duyacağınız için JOIN tartışmaları bağlamında bahsetmeye değer olduğunu hissettim.

UYGULA :

  1. ÇAPRAZ UYGULA - INNER JOIN'e benzer (Ancak Sol tablonun her satırı için Sağ tabloda bir şey hesaplayabilmenin avantajını ekledi ve sadece eşleşen satırları döndürür)
  2. DIŞ UYGULAMA - SOL DIŞ birleştirmeye benzer (Ancak Sol tablonun her satırı için Sağ tablodaki bir şeyi hesaplayabilmenin avantajını ekledi ve Sağ tablodaki bir eşleşmeden bağımsız olarak Sol tablodaki tüm satırları döndürür)

https://www.mssqltips.com/sqlservertip/1958/sql-server-cross-apply-and-outer-apply/

https://sqlhints.com/2016/10/23/outer-apply-in-sql-server/

SQL'de OUTER / CROSS UYGULAMA ne zaman kullanılır?

APPLY operatörünü, bir alt sorguda aynı hesaplamayı yapmaktan daha iyi performans verdiği için çok faydalı buluyorum. Ayrıca, SQL Server'ın eski sürümlerindeki birçok Analitik fonksiyonun yerini alırlar. Bu yüzden JOINS ile rahat olduktan sonra, bir SQL geliştiricisinin bir sonraki UYGULA işleçlerini öğrenmeye çalışması gerektiğine inanıyorum.

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.