Bu yazıda outer join kullanılan sorguların nasıl yazılacağını öğreneceksiniz. Inner join kadar yaygın olmasa da outer join’in çok işlevli bir sorguda kullanılması, işletme verilerinize alternatif bir görünüm sağlayabilir. Inner join’de olduğu gibi tablolar arasında mantıksal bir ilişki ifade belirtmeniz gerekir. Fakat, sadece eşleşen niteliklere sahip satırları değil aynı zamanda diğer tablolarda bir eşleşme olup olmadığına bakılmaksızın tabloların birinde bulunan tüm satırlar da çekilecektir.

OUTER JOIN

Önceki bölümde inner join ile tablolardaki satırları nasıl eşleştireceğinizi öğrendiniz. Gördüğünüz gibi SQL Server, ON ifadesinde belirtilen koşulları yerine getirmeyen satırları filtreleyerek inner join sorgusunun sonuçlarını oluşturdu. Sonuç da yalnızca her iki tablodan eşleşen satırlar oldu. Bir örneğe bakalım, sonra süreci inceleyelim. İlk olarak aşağıdaki inner join sorgusunu inceleyin:

USE AdventureWorks;
GO
SELECT c.CustomerID, soh.SalesOrderID
FROM Sales.Customer AS c JOIN Sales.SalesOrderHeader AS soh
ON c.CustomerID = soh.CustomerID
--(31465 row(s) affected)

Bu arada veri tabanı olarak AdventureWorks2016 veri tabanını kullanılmıştır. Sorgu inner join ile yazıldığında 31.465 satır döndürmektedir. Bu satırlar müşteriler ve siparişler arasındaki eşleşmeyi temsil edmektedir. Sonuçlarda yalnızca her iki tabloda bulunan CustomerID’ler görünecektir. Sadece sipariş vermiş olan müşteriler sonuç olacak dönecektir.

Şimdi, left outer join şeklinde yazılmış aşağıdaki sorguyu inceleyelim:

USE AdventureWorks;
GO
SELECT c.CustomerID, soh.SalesOrderID
FROM Sales.Customer AS c LEFT OUTER JOIN Sales.SalesOrderHeader AS soh
ON c.CustomerID = soh.CustomerID
--(32166 row(s) affected)

Bu örnekte sorguda belirtilen sol tablodaki tüm satırları (Sales.Customer) korumak için yönlendiren ve Sales.SalesOrderHeader’daki eşleşen satırlar için SalesOrderID değerlerini görüntüleyen bir LEFT OUTER JOIN operatörü kullanlmıştır. Ancak sonuçta dönen daha fazla satır bulunmaktadır. Sipariş vermiş olsun veya olmasın tüm müşteriler döndürülmüştür. Bu bölümde göreceğiniz gibi outer join işleminde, eşleşme sağlansın yada sağlanılmasın birleşme veya birleşme noktasının bir tarafındaki tüm satırlar gösterilir.

Peki outer join sorgusu eşleşmeyen sütunlarda ne görüntüler? Bu örnekte, 701 müşteri için eşleşen sipariş yoktur. SQL Server, değerlerin başka sebepten eksik olduğu durumlarda SalesOrderID sütununun yerine NULL çıktısı verecektir.

Outer Join Syntax

Outer join kullanarak sorgular yazarken, aşağıdaki yönergelere dikkat etmekte fayda var:

  • Görüldüğü üzere tablo takma adları sadece SELECT ifadesi için değil ON ifadesinde kullanmak için de uygulanmaktadır.
  • Outer join’ler, OUTER JOIN ifadesinin önüne koyulan LEFT, RIGHT veya FULL anahtar kelimeleri kullanılarak ifade edilir. Anahtar kelimelerin amacı, hangi taraftaki tablodaki değerlerin korunacağını ve bu tablonun tüm satırların görüntüleneceğini, eşleşip eşleşmediğini göstermektir.
  • Inner join’de olduğu gibi, outer join’ler de bir orderID gibi tek bir eşleşme niteliğinde veya orderID ve productID gibi çok sayıda eşleşme niteliği kullanılarak gerçekleştirilebilir.
  • Inner join’den farklı olarak, FROM deyimindeki tabloların listelenip birleştirildiği sıra önemlidir, çünkü LEFT veya RIGHT’ın hangisini seçtiğiniz join işlemini belirleyecektir.
  • Çok değişkenli join’ler OUTER JOIN ile daha karmaşık olmaktadır. Outer join’in sonuçlarında NULL değerlerin oluşu, ara sonuçların daha sonra bir inner join ile üçüncü bir tabloda birleştirilmesi sırasında sorunlara neden olabilmektedir. NULL değerli satırlar, ikinci join’in predicate’i ile filtrelenebilir.
  • Sadece hiçbir eşleşme olmayan satırları görüntülemek için OUTER JOIN predicate’inden sonra WHERE ifadesinde NULL değerler için test ekleyin.
Outer Join Örnekleri

Aşağıda, outer join hakkında bazı örnekler verilmiştir.

Bu sorguda tüm müşteriler görüntülenir ve varsa siparişlerinin her biri hakkında bilgi sağlanır:

USE TSQL;
GO
SELECT c.custid, c.companyname, o.orderid, o.orderdate
FROM Sales.Customers AS c
LEFT OUTER JOIN Sales.Orders AS o
ON c.custid = o.custid;

Bu sorguda ise yalnızca hiç sipariş vermemiş olan müşteriler gösterilmektedir:

SELECT c.custid, c.companyname, o.orderid, o.orderdate
FROM Sales.Customers AS c
LEFT OUTER JOIN Sales.Orders AS o
ON c.custid = o.custid
WHERE o.orderid IS NULL;
SELECT c.custid, c.companyname, o.orderid
FROM Sales.Customers AS c
FULL OUTER JOIN Sales.Orders AS o
ON c.custid = o.custid
SELECT c.custid, c.companyname, o.orderid
FROM Sales.Customers AS c
FULL OUTER JOIN Sales.Orders AS o
ON c.custid = o.custid
WHERE o.orderid IS NULL OR c.orderid IS NULL;