SOL BAĞLANTIYA SAĞ DOĞRU SEÇMEK


18

Doğru anlıyorsam, her RIGHT JOIN:

SELECT Persons.*, Orders.*
FROM Orders
RIGHT JOIN Persons ON Orders.PersonID = Persons.ID

şu şekilde ifade edilebilir LEFT JOIN:

SELECT Persons.*, Orders.*
FROM Persons
LEFT JOIN Orders ON Persons.ID = Orders.PersonID

Benim kişisel görüşüm ifadenin amacı:

  • İlk önce Persons
  • Ardından aşağıdakileri Personsyapmak için gerektiği gibi genişletin / tekrarlayın:Orders

Persons LEFT JOIN Ordersters sıralamaya göre daha iyi ifade edilir Orders RIGHT JOIN Persons(ve RIGHT JOINsonuç olarak asla kullanmam ).

A'nın RIGHT JOINtercih edildiği durumlar var mı? Ya RIGHT JOINda yapamayacağınız bir şeyin yapılabileceği kullanım durumları var LEFT JOINmı?


12
Doğru katılmak istediğim bir vakayı hatırlayamıyorum. Ben bir sorgu yürütme planı performans nedenleriyle sağ birleşim etrafında sol birleştirme çevirme durumlarda oldu. Ama saf bir kod yazma açısından, hayır, doğru bir birleşim yazdığımı hatırlamıyorum.
Brandon

2
Bunu "kodu açıklama, yazma veya hata ayıklama" hakkında bir soru olarak görmüyorum. Bir dilin, aslında aralarında herhangi bir fark varsa ve "açık olmayan" bir dil tercih edildiğinde, görünüşte aynı şeyi yapan iki özelliğe sahip olduğunu soruyor.
Philip Kendall

1
Hayır, sol birleştirme neredeyse her zaman en kısa zamanda ihtiyacınız olanı yakalar ve akıl yürütmesi daha kolaydır. Benim işyerimde, aslında sağ birleşmeleri önlemek için bir standarda sahibiz, çünkü hiçbir zaman gerekli olmadıkları bir durum yoktur (yani her zaman karşı taraf sol birleşimiyle değiştirilebilir).
mgw854

8
Yakın oyları sıfırladım - birleştirmeler arasındaki farkın anlaşılması yazılım tasarımını etkilediğinden (veritabanı tasarımı yazılım tasarımının bir parçasıdır, veritabanlarını sorgulayabilecek algoritmalar gibi) bu soru burada konudur. Aynı zamanda olabilecek Veritabanı Yöneticileri de konuyla olmak ve orada yanı yinelenen olabilir.
Thomas Owens

1
Bunun RIGHT JOINönerilen veya daha yaygın olduğunu önerdiğinizden emin değilim . Bu sizin öncülünüzse, yanlıştır. Ben herhangi bir kod ya da örneklerde kullanılan sağ katılmak gördüğüm bir zaman düşünemiyorum. Bu var JOINya LEFT OUTER JOIN. Nadir durumlarda a FULL OUTER JOIN.
JimmyJames

Yanıtlar:


12

Bu, hangi gereksinimi karşılamaya çalıştığınıza bağlıdır.

Bunu söylemek aynı değil: "Tüm kişi ve bunlara karşılık gelen siparişleri ver" o "Ben bunlara karşılık gelen kişilerle tüm siparişler istiyoruz" Eğer kullanım için gidiyoruz, özellikle is nullhiçbir karşılık gelen maç ile satırları getirmek. Ben buna "baskın tablo" diyorum, birleşimin diğer tarafında karşılık gelen bir satır olmamasına bakılmaksızın satırları almak istiyorum tablo.

Bu resimlere bakın ve aynı olmadıklarını göreceksiniz:

resim açıklamasını buraya girin

Görüntünün kaynağı bu mükemmel makaledir .

Ancak, her iki gereksinimin de birleştirme ile tabloların sırasını tersine çevirerek yerine getirilebileceğinden haklısınız.

Ama sanırım soldan sağa yazmaya alışkın batılı insanlar için, sağ birleşimler üzerinde sol birleşimleri kullanmak daha doğal geliyor , çünkü birleşimlerin selected sütunlarıyla aynı yönde veya aynı sırada olmasını istiyoruz .

Bu yüzden doğru bir birleşmeyi tercih etmenin olası bir nedeni , kültürünüzde sağdan sola (Arapça veya İbranice yazı sistemlerinde olduğu gibi) yazmanız ve belki de beyninizde metin bilgilerinin sağdan sola akması anlamına gelir. .

Bazı dilbilimciler dilinizin düşünme biçiminizi etkilediğini düşünür: https://www.edge.org/conversation/lera_boroditsky-how-does-our-language-shape-the-way-we-think


1
Bu çizgiler boyunca düşünmeye başlamıştım, ama doğru olduğunu düşünmüyorum. İbranice SQL yazmayı hayal etmeye başladım (ki aslında hiç yapmadım). Tamam: sağa yaslanmış, sağdan sola, yukarıdan aşağıya. Yine de önce A tablosundan sonra B tablosundan bahsedeceksiniz. Doğru bir birleşimle, ilk olarak belirtilen tablonun çoğunu veya tamamını hariç tutabilirsiniz (özellikle boş durumda). İnsan zihninin ilk önce birincil ve en önemlisi ile birleşme eğiliminde olduğunu düşünüyorum . Bu, yazma yönünden bağımsız olarak gerçekleşir. Onlara "İLK KATIL" ve "İKİNCİL KATIL" diyebilirsiniz ve bu önyargı hala gerçekleşir.
Mike Monica'yı

Aşağıda gösterdiğiniz resme bir bağlantı ekledim.
Jon Raynor

@Mike insanların Arapça veya İbranice SQL yazmasını önermiyorum. Sadece anadilinizin oryantasyonunun doğru birleşme tercih etmenizin bir nedeni olabilir. Ama bu sadece bir olasılık. Sol birleşimleri daha doğal buluyorum.
Tulains Córdova

Şimdi, resmin yaratıcısına gereken krediyi verdim.
HD'mde

İbranice bilmektedir ve hala LEFT JOINdaha doğal buluyorum .
Zev Spitz

3

Sol bir birleştirmeyle yapılamayacak doğru bir birleştirme ile yapılabilecek hiçbir şey (bildiğim) yoktur. Ancak bazen sol birleşimlerle sözdizimi daha çirkin olur. Diyelim ki aşağıdaki tablolarınız var:

Persons
ID | Name

Orders
ID | CustomerId | other unimportant stuff

SpecialOrderDetails
ID | OrderId | other stuff

Diyelim ki veritabanınızdaki tüm kişilerin bir listesini ve özel sipariş ayrıntılarıyla sahip oldukları siparişleri almanız gerekiyor (tüm siparişlerin özel sipariş ayrıntılarına sahip olmadığını söyleyeceğiz). Yani normalde insanlardan siparişlere sol birleştirme yaparsınız. Ama sonra özel sipariş detaylarına katılmak zorundasınız. Orada bir iç birleşim kullanırsanız, insanlardan emirlere, iç birleşmeye doğru sol birleşmeyi etkili bir şekilde yapar. IE: yapmak istediğiniz budur, ancak çalışmaz (özel bir siparişi olmayanları hariç tutar):

select p.*, o.*, d.*
from Persons p
left join Orders o on o.CustomerId = p.Id
inner join SpecialOrderDetails d on d.OrderId = o.Id

Böylece şu şekilde yeniden yazabilirsiniz:

--get all the people without a special order
select p.*, NULL, NULL, ... --NULLs placeholders for all the fields from OrderDetails and SpecialOrderDetails
from Persons p
left join Orders o on o.CustomerId = p.Id
left join SpecialOrderDetails d on d.OrderId = o.Id
where o.Id is null 

union

--get all the people with a special order
select p.*, o.*, d.*
from Persons p
inner join Orders o on o.CustomerId = p.Id
inner join SpecialOrderDetails d on d.OrderId = o.Id

Tam olarak açık değil (yorum yok), ancak iş yapıyor. Bu, bir kerelik bir şeyden daha fazlası ise (yani, bir gün geri gelip bir gün bakımını yapmak zorunda kalacak bir şey), doğru bir birleşimi kullanmak niyetin ne olduğunu daha net hale getirebilir.

select p.*, o.*, d.*
from Orders o
inner join SpecialOrderDetails d on d.OrderId = o.Id
right join Persons p on p.Id = o.CustomerId

Bu biraz daha özlü ve açıktır (ancak sadece okuyan herkes doğru birleşimleri anlarsa). Bunun sol birleşimlerle yazılabileceğini, ancak iç içe bir birleşim gerektirdiğini unutmayın (bu, muhtemelen sağ birleşimlere göre daha az kişi tarafından bilinir).

select p.*, o.*, d.*
from Persons p
left join Orders o 
    inner join SpecialOrderDetails d on d.OrderId = o.Id
on o.CustomerId = p.Id

Bu noktada, en açık olanın ve çoğu insanın ne anlayacağının bir seçimidir (iç içe birleştirme olarak adlandırıldığını bilmiyorsanız bu sözdizimini nasıl google'a çevireceğinizi biliyor musunuz?).

Kısacası, kesinlikle doğru birleşimlere ihtiyacınız yoktur , ancak okumayı kolaylaştırabilirler.


Sanırım belki sadece sağ elini kullanıyorsun.
Robert Harvey

Birden sol bu durumda katılır yazamam neden takip edemedim: SELECT p.*, o.*, d.* FROM Persons p LEFT JOIN Orders o ON o.CustomerID = p.ID LEFT JOIN SpecialOrders d ON o.Id = d.OrderID.
Zev Spitz

@RobertHarvey Öyleyim, ama elinin onunla ne ilgisi olduğundan emin değilim.
Becuzz

@ZevSpitz Belki yazdıklarımdan net değildi, ama fikir sadece özel bir sipariş ayrıntıları kaydı varsa siparişlerden alan istemenizdi, yani. sadece çiftleri varsa onlara katılırlar.
Becuzz

-1

Çoğaltma / birleştirme amacıyla kullanılan bir DOĞRU BAĞLANTI görebiliyordum. Diyelim ki A ve B şeklinde iki tablom var. A solda ve B sağda. Diyelim ki bu iki tablo arasında verileri eşdeğer hale getirmek istedim.

A'da olan ancak B'de olmayan tüm verileri göstermek istesem, SOL bir katılım olurdu. B'de A'da olmayan tüm verileri göstermek istesem DOĞRU olur.

Bu nedenle, bazen olası şeyleri tutmak için verileri birleştirirken ve çoğaltırken SOL ve SAĞ kullanışlı olur.

Bunun dışında, tüm SAĞ birleşimler SOL birleşimlere dönüştürülebilir veya tam tersi, tüm SOL birleşimler tabloların nasıl sıralandığına veya görselleştirildiğine bağlı olarak SAĞ birleşimlere dönüştürülebileceğinden, SAĞ birleşimi kullanmak için başka bir neden göremiyorum. Yani, diğer durumlarda bu bir tercih meselesi olacaktır.

İşte SQL birleştirmelerini görselleştirmek için güzel bir bağlantı.

http://www.codeproject.com/Articles/33052/Visual-Representation-of-SQL-Joins


-1

sol birleşim sağ birleşimin tersi değil, farklı sonuçlar veren aşağıdaki durumu kontrol edin

select * from 
(select 1 as x  where 1=1) a left join 
(select 1 as x  where 1=0) b on a.x=b.x inner join 
(select 1 as x  where 1=1) c on b.x=c.x

select * from 
(select 1 as x where 1=1) c inner join 
(select 1 as x where 1=0) b on c.x=b.x right join 
(select 1 as x where 1=1) a on b.x=a.x

b ve anc tabloları her zaman iç birleşimdir, ancak ilkinde a diğerlerine birleştirilir ve ikincisinde a sağ birleşir

sol birleşim satır döndürmezken sağ birleşim satır döndürür


bu daha teğetsel bir yorum gibi okunur, bkz. Nasıl Cevap
gnat

-2

Tercih etmek için hiçbir neden yoktur RIGHT JOINve LEFT JOINçok daha açıktır:

Kişileri SEÇİN. *, Siparişler. * Kişilerden SOLA Kişilere SOL GİRİN .ID = Siparişler.KişiselID

hangi tablonun sorgulandığını hemen görmenizi sağlar. Halbuki ile RIGHT JOIN:

Kişileri SEÇİN. *, Emirler. * Emirlerden SAĞ Kişilere Emirlere KATILIN.PersonID = Persons.ID

ilk tablo JOIN.

Deneyimlerime göre, hiç görmedim RIGHT JOIN.


1
Bu soruya ne katıyor? Soru, farkın ne olduğu değil mi? ; Soru, neden kullanmalıyım RIGHT JOIN? .
Zev Spitz

@ZevSpitz Hangisini tercih edeceğinizi soruyorsunuz, size bir sebep veriyorum. Hangi kullanım durumu, tat meselesi olduğu için önemli değildir.
kirie
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.