Bundan daha önceki INNER JOIN ile alakalı yazılarımda iki tablo üzerinde işlem gerçekleştirdim. Ama biz yazılım geliştiriciler daha çok tablo üzerinde sorgu yapma ihtiyacı duyabiliriz. Özellikle çoka çok ilişkilerde daha fazla tabloyu birleştirerek sorgulama yapma ihityacı sıklıkla rastlanılan bir durumdur. Örneğin bir okulun veritabanında öğrencilerin bilgilerinin tutulduğu bir tablo, birde ders bilgilerinin yer aldığı bir tablo olsun. Burada şuna ihtiyaç duyabilirsiniz, üçüncü bir tabloda da hangi öğrenci hangi dersleri alıyor?
Yine adventureworks veritabanına dönelim ve bu veritabanı üzerinde sipariş tarihine göre yapılan her sipariş için ürün listesini görmek istediğimizi varsayalım. Burada Sipariş tarihi bilgisi yani OrderDate Sales.SalesOrderHeader tablosunda, sipariş bilgisi Sales.SalesOrderDetail tablosunda ve ürün bilgisi Production.Product tablosunda yer almakta.Yani bu işlem için bu 3 tabloyu birbirine bağlamam gerekiyor başka bir deyişle bu tabloları birleştirmem gerekiyor. Bunu resmedersek;
İkiden fazla tablo birleştiriminde syntax aşağıdaki gibidir:
SELECT listelenmesini istediğimiz kolonlar FROM tablo1Adı
INNER JOIN tablo2Adı ON tablo1.kolon1 = tablo2.kolon2
INNER JOIN tablo3Adı ON tablo2.kolon2 = tablo3.kolon3
Daha fazla tablo eklemek istediğimiz de de tekrar INNER JOIN satırı ilave edip diğer tabloları belirtiriz.
Şimdi sorgumuzu oluşturalım.
SELECT soh.SalesOrderID, soh.OrderDate, p.ProductID, p.Name FROM Sales.SalesOrderHeader AS soh INNER JOIN Sales.SalesOrderDetail AS sod ON soh.SalesOrderID = sod.SalesOrderID INNER JOIN Production.Product AS p ON sod.ProductID = p.ProductID ORDER BY soh.SalesOrderID
Böylelikle sorgumu oluşturdum. Sonucu aşağıdaki gibi :
Sorgumuzu açıklayayım, öncelikle Sales.SalesOrderHeader tablosu ile Sales.SalesOrderDetail tablosunu SalesOrderID kolonu üzerinde birleştiriyoruz. Daha sonra bu birleşimin ardından Sales.SalesOrderDetail tablosu ile Production.Product tablosu üzerindeki ProductID kolonunu birleştiriyoruz.
INNER JOIN ile bir kaç uygulama daha yapıp yazıyı bitirelim.
1) HumanResources.Employee tablosunda çalışan isimleri yer almıyor. Bu tablo ile Person.Person tablosundaki BusinessEntityID kolonunu birleştirerek job title, birth date, first name ve last name alanlarını listeleyelim.
SELECT JobTitle, BirthDate, FirstName, LastName FROM HumanResources.Employee AS Calisan INNER JOIN Person.Person AS Kisi ON Calisan.BusinessEntityID = Kisi.BusinessEntityID
2) Müşteri isimleri Person.Person tablosunda yer almaktadır. Sales.Customer tablosu ile Person.Person tablosunu birleştirelim. Bu tablolardaki Person.Person tablosunda yer alan BusinessEntityID kolonu ile Sales.Customer tablosunda yer alan PersonID kolonu eşleşmekte bu birleştirmeyi buna göre yapacağız. Listelemek istediğim kolonlar ise FirstName, LastName, MiddleName, CustomerID, StoreID ve TerritoryID.
SELECT CustomerID, StoreID, TerritoryID, FirstName, MiddleName, LastName FROM Sales.Customer AS Musteri INNER JOIN Person.Person AS Kisi ON Musteri.PersonID = Kisi.BusinessEntityID
3) iki numaralı maddede yer alanlara ilaveten Sales.SalesOrderHeader tablosu ile Sales.Customer tablosundaki CustomerID kolonunu da birleştirelim.
SELECT Musteri.CustomerID, StoreID, Musteri.TerritoryID, FirstName, MiddleName, LastName, SalesOrderID FROM Sales.Customer AS Musteri INNER JOIN Person.Person AS Kisi ON Musteri.PersonID = Kisi.BusinessEntityID INNER JOIN Sales.SalesOrderHeader AS Satis ON Satis.CustomerID = Musteri.CustomerID
4) Sales.SalesOrderHeader tablosu ile Sales.SalesPerson tablosunu birleştirelim. Yapacağımız işlem, Sales.SalesPerson tablosundaki BusinessEntityID kolonu ile Sales.SalesOrderHeader tablosundaki SalesPersonID kolonlarını birleştirmek. Listeleyeceğimiz kolonlar : SalesOrderID, SalesQuota ve Bonus.
SELECT SalesOrderID, SalesQuota, Bonus FROM Sales.SalesOrderHeader AS Satis INNER JOIN Sales.SalesPerson AS SatisElemani ON Satis.SalesPersonID = SatisElemani.BusinessEntityID
5) Dört numarada yaptığımız sorguya ek işlem katalım. Person.Person tablosundaki FirstName, MiddleName, LastName alanlarınında listelenmesini sağlayalım.
SELECT SalesOrderID, SalesQuota, Bonus, FirstName, MiddleName, LastName FROM Sales.SalesOrderHeader AS Satis INNER JOIN Sales.SalesPerson AS SatisElemani ON Satis.SalesPersonID = SatisElemani.BusinessEntityID INNER JOIN Person.Person AS Kisi ON SatisElemani.BusinessEntityID = Kisi.BusinessEntityID
6) Production.ProductModel tablosunda her ürün için yer alan katalog özelliklerini (renk, boy, açıklama) gibi özellikleri listeleyelim. Şimdi bunu yapabilmek için Production.ProductModel ve Product.Product tabloları arasında bir bağlantı yapmam gerekiyor.
SELECT UrunModel.CatalogDescription, Color, Size FROM Production.Product AS Urun INNER JOIN Production.ProductModel AS UrunModel ON Urun.ProductModelID = UrunModel.ProductModelID
7) Şimdi de veritabanı üzerinde satın alınan ürünlerin hangi müşteri tarafından alındığını listeleyelim.
SELECT FirstName, MiddleName, LastName, Urun.Name FROM Sales.Customer AS Musteri INNER JOIN Person.Person AS Kisi ON Musteri.PersonID = Kisi.BusinessEntityID INNER JOIN Sales.SalesOrderHeader AS SOH ON Musteri.CustomerID = SOH.CustomerID INNER JOIN Sales.SalesOrderDetail AS SOD ON SOH.SalesOrderID = SOD.SalesOrderID INNER JOIN Production.Product AS Urun ON SOD.ProductID = Urun.ProductID
Bir sonraki yazıda görüşmek üzere..
Güzel Anlatım,Teşekkürler
select * Company.Id,Contact.name from
on Company left join Contact
Company.Id=Contact.name
Company de hata veriyor neden tablolarda var sorgumu yanlış acaba
on Company.Id=Contact.name böyle olmalı.