Anasayfa / Yazılım / SQL / LEFT OUTER JOIN ve RIGHT OUTER JOIN

LEFT OUTER JOIN ve RIGHT OUTER JOIN

Daha önceki tablo birleştirme yazılarımda INNER JOIN’den bahsetmiştim. INNER JOIN ile iki tabloyu birleştirirken iki tablo arasında mutlaka tam bir eşleşme olması gerekmektedir. Ancak bazen öyle durumlar olur ki, iki tablo arasında birleştirme yapmamız gerekirken aynı zamanda bu tablolardan birindeki verilerin hepsinin de listelenmesini isteriz. Örneğin bir e-ticaret sitesinde müşteriler ve aldıkları ürünlerini listelemek istediğimizi bununla birlikte henüz hiç alışveriş yapmayan müşterileride listeletmek istediğimizi varsayalım. İşte bu gibi durumlarda OUTER JOIN kullanmamız gerekiyor. Böylelikle hem müşteriler tablosu ile aldıkları ürünleri siparişler tablosundan eşleştirerek listeleriz hemde müşteriler içinden henüz sipariş vermeyenleri de listeleme imkanına kavuşuruz.

OUTER JOIN kullanımı kendi içinde iki şekilde kullanılmaktadır. LEFT OUTER JOIN ve RIGHT OUTER JOIN.

LEFT OUTER JOIN: OUTER JOIN kullanırken mutlaka LEFT ya da RIGHT özelliklerinden hangisinin kullanılacağını belirtmemiz gerekiyor. Peki nedir bu LEFT ve RIGHT?

Eğer birleştirdiğimiz iki tablo içinde tüm satırlarını göstermek istediğimiz ana tabloyu sorgumuzda sol tarafta yazıyorsak mutlaka LEFT OUTER JOIN kullanmamız gerekir. Örneğin aşağıdaki şekilde Sales.Customer ve Sales.SalesOrderHeader tablolarını LEFT OUTER JOIN ile birleştirdiğimiz de Sales.Customer tablosundaki tüm müşterilerin herhangi bir sipariş yapsalarda yapmasalar da listelenmesini sağlayacak birleştirme metodudur. Şekilde görülen gri alanda yer alan veriler bu sorguda listeleneceklerdir. Yani Sales.Customer tablosunun tamamı ile Sales.Customer ve Sales.SalesOrderHeader tablolarının kesiştiği noktalar sorgumuzda listelenirler.

2013021901

Syntax olarak aşağıdaki gibi :

SELECT listelenecek kolonlar FROM tablo1 LEFT OUTER JOIN tablo2 ON tablo1.kolon1 = tablo2.kolon2

Şimde üstte venn şeması ile resmettiğim durumu kodlara aktarayım. AdventureWorks veritabanı üzerinde çalışıyorum.

SELECT Musteri.CustomerID, Satis.SalesOrderID, Satis.OrderDate 
FROM Sales.Customer AS Musteri
LEFT OUTER JOIN Sales.SalesOrderHeader AS Satis ON Musteri.CustomerID = Satis.CustomerID
WHERE Musteri.CustomerID IN (1,2,11000,11010,11028,11029,11030,11040,11050,11060,11070)

2013021902

SQL sorgusunda görüleceği üzere tıpkı INNER JOIN’de olduğu gibi burda da tabloların arasında hangi kolon veya kolonlar arasında bağlantı kurulacak ise bunu belirliyoruz. Sorgumuzda sol tarafta yer alan Sales.Customer tablosundaki tüm verileri listeliyoruz. Çünkü LEFT OUTER JOIN dedik. Bununla birlikte eşleşenleride listeliyoruz burada eşleşme kuralımızda sol taraftaki Sales.Customer tablosundaki CustomerID alanı ile Sales.SalesOrderHeader tablosundaki CustomerID alanlarının eşleşmesi ile belirleniyor. Sonuç görüntüsüne de baktığımızda zaten bu durumu rahatlıkla görebiliriz. Görüleceği üzere eşleşen satırlarda OrderDate alanı dolu ancak 1 ve 2 nolu CustomerID alanlarında NULL veri mevcut çünkü burada sipariş yok dolayısı ile eşleşme yok.

RIGHT OUTER JOIN: LEFT OUTER JOIN’den tek farkı tablolarının yerinin farklı olmasıdır. Bu sefer herhangi bir eşleşme durumu olmasa dahi tüm satırlarını listeletmek istediğimiz tabloyu sağda gösterecek isek bu sefer RIGHT kullanırız.

Syntax olarak aşağıdaki gibi :

SELECT listelenecek kolonlar FROM tablo1 RIGHT OUTER JOIN tablo2 ON tablo1.kolon1 = tablo2.kolon2

Şimdi aşağıdaki sorguyu çalıştıralım ve sonucu görelim :

SELECT Musteri.CustomerID, Satis.SalesOrderID, Satis.OrderDate 
FROM Sales.SalesOrderHeader AS Satis
RIGHT OUTER JOIN Sales.Customer AS Musteri ON Musteri.CustomerID = Satis.CustomerID
WHERE Musteri.CustomerID IN (1,2,11000,11010,11028,11029,11030,11040,11050,11060,11070)

2013021903

Görüldüğü üzere sonuç aynı. Sorgular arasındaki tek fark FROM ifadesinden sonraki kısımlar ve RIGHT ile LEFT alanlarının değişik olması.

Bir yorum

  1. Çok teşekkür ederim.Örnekler çok güzel olmuş.

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir