SQL Server'da sol birleştirme ve sağ birleştirme arasındaki fark


225

SQL Server'daki birleştirmeleri biliyorum.

Örneğin. İki tablo vardır Tablo1, Tablo2.

Tablo yapıları aşağıdaki gibidir.

create table Table1 (id int, Name varchar (10))

create table Table2 (id int, Name varchar (10))

Tablo 1 verileri aşağıdaki gibidir:

    Id     Name     
    -------------
    1      A        
    2      B    

Tablo2 verileri aşağıdaki gibidir:

    Id     Name     
    -------------
    1      A        
    2      B 
    3      C

Aşağıda belirtilen SQL ifadelerinin her ikisini de çalıştırırsam, her iki çıktı da aynı olacaktır

select *
from Table1
  left join Table2 on Table1.id = Table2.id

select *
from Table2
  right join Table1 on Table1.id = Table2.id

Lütfen yukarıdaki SQL ifadelerinde sol ve sağ birleşim arasındaki farkı açıklayın.

Yanıtlar:


73
Select * from Table1 left join Table2 ...

ve

Select * from Table2 right join Table1 ...

aslında tamamen değiştirilebilir. Ancak bir fark görmek için Table2 left join Table1(veya aynı çifti Table1 right join Table2) deneyin . Bu sorgu size daha fazla satır vermelidir, çünkü Table2 Tablo1'de bulunmayan kimliğe sahip bir satır içerir.


17
Öyleyse RIGHT JOIN, istenen herhangi bir sonucu adil bir şekilde elde edebiliyorsak neden ihtiyacımız var LEFT JOIN? : P
user1857492

1
@SilapAliyev Bu aslında çok iyi bir soru. Birisi cevap verebilir mi? : D
Ian Chu Te

21
Select * from Table1 left join Table 2TÜM tablo 1 kayıtlarını artı Tablo 2'nin çakışan kayıtlarını Select * from Table1 right join Table 2döndürür . Aksi ise Tablo 2'deki TÜM kayıtları ve Tablo 1'in çakışan kayıtlarını döndürür.
Programador Adagal

3
2'den fazla tablo kullanırsanız, doğru birleştirmeyi kullanmak anlamlı ve okunabilir olabilir
ʞɔıɥʇɹɐʞ ouɐɯ

1
@MarkusMeskanen 7 kelimelik basit bir cümleyi değiştiriyorsunuz. U, birden fazla cümle ile 356 satırlık bir cümleye sahip olduğunuzda ve Sol Sağ mantığını değiştirmeniz gerektiğinde, sadece oneword ile değiştirmeyi merak edersiniz ...
Programador Adagal

1014

Codeproject, SQL birleşimlerinin basit temellerini açıklayan bu görüntüye sahiptir, http://www.codeproject.com/KB/database/Visual_SQL_Joins.aspx SQL birleştirmeleri açıklandı


64
Orada çok fazla 'ayrıntı' yok. Kredi aslında benden ziyade kod projesi sayfasına gitmelidir. Ama elbette ilgiyi umursamıyorum :-)
Daan Timmer

6
@Daan Timmer hayır, size de kredi olmalı! Belirli ve özel bir talebi karşılamak için yeniden paketleyip satarsınız. Perakendeciler $$ milyarlarca aynı şeyi ve almak
BKSpurgeon

"DIŞ BAĞLANTI DIŞINDA" son rakamı nerede "VE" koşulu gerektirebilir hissediyorum. Sorgu SEÇİM <select_list> Tablo_A FULL OUTER JOIN SEÇİLMESİ için güncellenmesi gerektiğini hissediyorum A.Key = B.Anahtar A.Key NULL NEDİR VE B.Anahtar NULL IS
vinsinraw

@vinsinraw gerekli değil. Çünkü o zaten koşulu ile kaplıdır: JOIN Table_B b ON A.Key = B.Key. OR koşulu gayet iyi çalışıyor.
Daan Timmer

Bu, Venn diyagramlarının yaygın olarak kötüye kullanılmasıdır. A ve B çevreleri A ve B tablolarını temsil etmez , A dairesi SOL BİR birleşimdir ve B çevresi bir DOĞRU B'dir. Ayrıca ON koşulunun ne olduğu ve anahtarların alakasız olduğu ve NEREDE her çalışmaz durum. Bu sayfadaki ve bu bölümdeki Re Venn diyagramları hakkındaki yorumlarım ve cevabımı görün .
philipxy

37

Veri aldığınız tablo 'SOL'.
Katıldığınız masa 'SAĞ'.
SOL BİRLEŞTİR: Sol tablodan VE (yalnızca) eşleşen öğeleri sağ tablodan al.
SAĞ BİRLEŞTİR: Tüm öğeleri sağ tablodan VE (yalnızca) sol tablodan eşleşen öğeleri al.
Yani:

Select * from Table1 left join Table2 on Table1.id = Table2.id  

verir:

Id     Name       
-------------  
1      A          
2      B      

fakat:

Select * from Table1 right join Table2 on Table1.id = Table2.id

verir:

Id     Name       
-------------  
1      A          
2      B   
3      C  

Eğer doğru daha fazla satıra sahip masaya az satırlarla tablo birleştirdiklerini
VE
fazla satır ile masaya az satırlarla tablo katılmadan sol yine
deneyin:

 If Table1.Rows.Count > Table2.Rows.Count Then  
    ' Left Join  
 Else  
    ' Right Join  
 End If  

22

(INNER) JOIN: Her iki tabloda da eşleşen değerlere sahip kayıtları döndürür.

SOL (DIŞ) BİRLEŞTİR: Sol tablodan tüm kayıtları ve sağ tablodan eşleşen kayıtları döndürür.

SAĞ (DIŞ) BİRLEŞTİR: Tüm kayıtları sağ tablodan ve eşleşen kayıtları sol tablodan döndürür.

FULL (OUTER) JOIN: Sol veya sağ tabloda bir eşleşme olduğunda tüm kayıtları döndürür

Örneğin, aşağıdaki kayıtları içeren iki tablonuz olduğunu varsayalım:

Tablo A

id   firstname   lastname
___________________________
1     Ram         Thapa
2     sam         Koirala
3     abc         xyz
6    sruthy       abc

Tablo B

id2   place
_____________
1      Nepal
2      USA
3      Lumbini
5      Kathmandu

İç birleşim

Not: İki tablonun kesişimini verir.

İç birleşim

Sözdizimi

SELECT column_name FROM table1 INNER JOIN table2 ON table1.column_name = table2.column_name;

Örnek tablonuza uygulayın:

SELECT TableA.firstName,TableA.lastName,TableB.Place FROM TableA INNER JOIN TableB ON TableA.id = TableB.id2;

Sonuç:

firstName       lastName       Place
_____________________________________
  Ram         Thapa             Nepal
  sam         Koirala            USA
  abc         xyz              Lumbini

Sol yönden katılım

Not: TableA'da seçilen tüm satırların yanı sıra TableB'de seçilen tüm sıraları verir.

Sol yönden katılım

SELECT column_name(s) FROM table1 LEFT JOIN table2 ON table1.column_name = table2.column_name;

Örnek tablonuza uygulayın

SELECT TableA.firstName,TableA.lastName,TableB.Place FROM TableA LEFT JOIN TableB ON TableA.id = TableB.id2;

Sonuç:

firstName   lastName    Place
______________________________
 Ram         Thapa      Nepal
 sam         Koirala    USA
 abc         xyz        Lumbini
sruthy       abc        Null

Doğru Katılma

Not: TableB'de seçilen tüm satırların yanı sıra TableA'da seçilen tüm sıraları verir.

Doğru Katılma

Sözdizimi:

SELECT column_name(s) FROM table1 RIGHT JOIN table2 ON table1.column_name = table2.column_name;

Samole masanıza uygulayın:

SELECT TableA.firstName,TableA.lastName,TableB.Place FROM TableA RIGHT JOIN TableB ON TableA.id = TableB.id2;

Sonuç bw olacaktır:

firstName   lastName     Place
______________________________
Ram         Thapa         Nepal
sam         Koirala       USA
abc         xyz           Lumbini
Null        Null          Kathmandu

Tam Katılma

Not: Birleştirme işlemi ile aynıdır, her iki tabloda da seçilen tüm değerleri döndürür.

Tam katıl

Sözdizimi:

SELECT column_name(s) FROM table1 FULL OUTER JOIN table2 ON table1.column_name = table2.column_name;

Numunenize uygulayın [le tablosu:

SELECT TableA.firstName,TableA.lastName,TableB.Place FROM TableA FULL JOIN TableB ON TableA.id = TableB.id2;

Sonuç:

firstName   lastName    Place
______________________________
 Ram         Thapa      Nepal
 sam         Koirala    USA
 abc         xyz        Lumbini
sruthy       abc        Null
 Null         Null      Kathmandu

Bazı gerçekler

INNER katılımları için siparişin önemi yok

(SOL, SAĞ veya TAM) DIŞ birleşimler için sipariş önemlidir

W3schools'da Daha Fazla Bilgi Edinin


12
select fields 
from tableA --left
left join tableB --right
on tableA.key = tableB.key

fromBu örnekteki tablo tableAilişkinin sol tarafındadır.

tableA <- tableB
[left]------[right]

Bu nedenle, soldaki tablodan ( tableA) tüm satırları almak istiyorsanız , sağ tabloda ( tableB) eşleşme olmasa bile , "sol birleşimi" kullanırsınız.

Ve sağdaki tablodan ( tableB) tüm satırları almak istiyorsanız , sol tabloda ( tableA) eşleşme olmasa bile ,right join ,.

Bu nedenle, aşağıdaki sorgu yukarıda kullanılana eşdeğerdir.

select fields
from tableB 
right join tableA on tableB.key = tableA.key

10

"Eğer bir sözdizimini RIGHT OUTER JOINkullanarak yeniden yazabilirsem, LEFT OUTER JOINo zaman neden bir RIGHT OUTER JOINsözdizimine sahip olabilirsiniz ?" Bu sorunun cevabının bence, çünkü dil tasarımcıları kullanıcılar üzerinde böyle bir kısıtlama yapmak istemiyordu (ve bence onlar öyleyse eleştirileceklerdi), bu da kullanıcıları tabloların sırasını değiştirmeye zorlayacak içinde FROMbazı durumlarda maddesi sadece birleştirme türü değiştirirken.


bazen sol ve sağ dış birleşimler tamamen değiştirilebilir, doğru mu?
ス レ ッ ク ス

4
@Alex: gerçekten sol ve sağ dış birleşimler her zaman değiştirilebilir.
gün6

8

İki ifadeniz eşdeğerdir.

Çoğu insan sadece LEFT JOINdaha sezgisel göründüğü ve evrensel sözdizimi olduğu için kullanıyor - tüm RDBMS'yi desteklemediğini sanmıyorum RIGHT JOIN.


"Tüm RDBMS'nin SAĞ BİRLEŞMEYİ desteklediğini sanmıyorum" - elbette, tüm RDBMS'ler SQL'i desteklemez. Ancak, bazı SQL ürünlerinin desteklediğini ima ediyorsanız, LEFTancak RIGHThangilerinin olmadığını lütfen belirtin .
birgün18

10
@onedaywhen Örneğin, SQLite 3 uygulanmaz RIGHTve FULL OUTER JOIN : sqlite.org/omitted.html
Mac_Cain13

0

İstediğimiz sonucu elde edebilmemiz için son rakamın maddesinde ANDkoşul gerektirebiliriz . Sorgunun güncellenmesi gerektiğini hissediyorumwhereOuter Excluding JOINA Union B Minus A Interaction B

SELECT <select_list>
FROM Table_A A
FULL OUTER JOIN Table_B B
ON A.Key = B.Key
WHERE A.Key IS NULL AND B.Key IS NULL

Eğer kullanırsak OR, tüm sonuçlarını alırız.A Union B


0

Table1 sol * birleşiminden * seçin. Table1.id'deki Table2 = Table2.id

İlk sorguda Sol katılmak karşılaştırır sol taraflı masa table1 için sağ taraflı masa tablo2 .

Hangi table1 tüm özellikleri gösterilecek, oysa table2 içinde sadece bu özellikler hangi koşulun gerçekleşeceği gösterilecektir.

Table1'den * seçin. Table1.id'deki Table1'e katılın = id = Table2.id

İlk sorguda Sağ katılmak karşılaştırır sağ taraflı masa table1 için sol taraflı masa tablo2 .

Hangi table1 tüm özellikleri gösterilecek, oysa table2 içinde sadece bu özellikler hangi koşulun gerçekleşeceği gösterilecektir.

Sorgudaki tablo bildirisinin sırası farklı olduğu için ikisi de sorgular aynı sonucu verecektir size bildirmek gibi table1 ve tablo2 içinde sağa sola sırasıyla içinde önce sol katılmak sorgu ve ayrıca ilan table1 ve tablo2 içinde sağ ve sol sırasıyla katılmak sağdan ikinci sorgu.

Her iki sorguda da aynı sonucu almanızın nedeni budur. Farklı bir sonuç istiyorsanız, sırasıyla bu iki sorguyu yürütün,

Table1 sol * birleşiminden * seçin. Table1.id'deki Table2 = Table2.id

Table1'den * seçin. Table1.id'deki Table2'yi birleştirme = id = Table2.id


0

Select * from Table1 t1 Left Join Table2 t2 on t1.id=t2.id Tanıma göre: Sol Birleştirme, Tablo 1'deki "select" anahtar sözcüğüyle ve Tablo 2'deki "on" anahtar kelimesinden sonraki ölçütlerle eşleşen sütunlarla belirtilen tüm sütunları seçer.

Benzer şekilde, Tanıma göre: Sağ Birleştirme, Tablo 2'deki "select" anahtar sözcüğüyle ve Tablo 1'deki "on" anahtar kelimesinden sonraki ölçütlerle eşleşen sütunlarla belirtilen tüm sütunları seçer.

Sorunuzla ilgili olarak, her iki tabloda bulunan id'ler, çıktıda atılması gereken tüm sütunlarla karşılaştırılır. Yani, ids 1 ve 2 her iki tabloda da yaygındır ve sonuç olarak, birinci ve ikinci tablolardan sırayla id ve ad sütunlarına sahip dört sütununuz olacaktır .

*select * from Table1 left join Table2 on Table1.id = Table2.id

Yukarıdaki ifade, tablo 1 ve sütunlardaki tüm kayıtları (satırları) ve tablo 2 ve tablo 2'deki eşleşen kimlikleri tablo 2'den alır.

select * from Table2 right join Table1 on Table1.id = Table2.id**

Yukarıdaki ifadeye benzer şekilde, tablo 1 ve sütunlardaki tüm kayıtları (satırları) alır ve tablo 1 ve tablo 2'deki eşleşen kimlikler tablo 2'den alınır. (Unutmayın, bu bir sağ birleşimdir, böylece tablo2'deki tüm sütunlar Tablo1'den dikkate alınacaktır).

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.