Son Haberler
Anasayfa / Yazılım / SQL / IN ve NOT IN Listelerinde Alt Sorgu Kullanımı

IN ve NOT IN Listelerinde Alt Sorgu Kullanımı

Yazıları düzenli takip edenler bundan önceki yazılarımda tabloları birleştirme fonksiyonlarından bahsettiğimi hatırlayacaklardır. JOIN metotları ile tabloları birleştirme yoluna gitmiştik. Şimdi ms sql’de alt sorgu oluşturmaya değinmek istiyorum. Bunu yapabilmek için tabii ki kullanacağımız cümlecik WHERE deyimi. Peki alt sorgu yani subquery nedir? Sub query Türkçesindne anlaşılacağı üzere bir sorgunun altında yer alan sorgu yani iç içe sorgudur. Yazılımcılar iç içe deyimi için aynı zamanda nested yapısı da demektedirler bunu da hatırlamış olalım. Alt sorguları kullanmamızın sebebi herhangi bir tablodaki kolon ile diğer tabloda eşleşen kolonların listelenmesini sağlamak yani aynı JOIN ile yaptığımız işlemler gibi ancak burada fark ikinci tablo aslında katılmıyor. Yani ikinci tablo katılmadan eşleşen satırlar bir tabloda listeleniyor. Örneklerde konu çok daha rahat anlaşılacaktır.

Şimdi IN ve WHERE deyimi ile birlikte bir alt sorgu oluşturalım.

SELECT CustomerID, AccountNumber FROM Sales.Customer
WHERE CustomerID IN (SELECT CustomerID FROM Sales.SalesOrderHeader);

Sorgum sonucu sipariş veren müşterilerin CustomerID bilgisi geri döner. Görüleceği üzere bu sorgudaki temel fark, Sales.SalesOrderHeader tablosunun sonuçlarının burada listelenmemesidir. Yani her müşteri sonuçlarda yalnızca bir defa gösteriliyor yani her sipariş için listelenmiyor.

2013022602

Bir örnek de WHERE ve NOT IN ile birlikte kullanım için yapalım.

Bir tablo ile diğer tablo arasında eşleşmeyen satırları listelemek içinde alt sorgu oluşturabiliriz. Bunun için WHERE deyimi ile birlikte IN yerine WHERE deyimi ile birlikte NOT IN kullanırız. Mesela bir önceki sorgumuzda sipariş veren müşterileri listeledik, şimdi de sipariş vermeyen müşterileri listeleyelim.

SELECT CustomerID, AccountNumber FROM Sales.Customer 
WHERE CustomerID NOT IN (SELECT CustomerID FROM Sales.SalesOrderHeader);

Bu sorgu sonucunda da bir üstte yer alan işlemin tam tersi şeklinde sonuçlar döner, yani eşleşmeyen veriler döner.

2013022603

Bazı dikkat edilecek noktalara değinmek istiyorum. Eğer biz bir tablodaki NULL değerleri dikkate almadan sorgular gerçekleştirirsek almış olduğumuz sonucun yanlış olma olasılığı çok fazladır. Örneğin sorgumun sonucunda içinde NULL değerler olan bir tablo mevcut ise ben bu sorgumda NOT IN kullanırken NULL değerleri göze almadan sorgumu oluşturmuşsam hatalı sonuç alırım. Şimdi örnekle durumu somutlaştıralım.

SELECT CurrencyRateID, FromCurrencyCode, ToCurrencyCode FROM Sales.CurrencyRate
WHERE CurrencyRateID NOT IN (SELECT CurrencyRateID FROM Sales.SalesOrderHeader);

2013022604

Görüleceği üzere sorgumun sonucunda hiç bir veri dönmüyor. Çünkü alt sorgu olarak yer alan kısımda NULL değerler mevcut. Buda sorgumun tamamını etkiliyor ve geriye değer dönmüyor. Dolayısı ile CurrencyRateID ile eşleşen diğer değerler görülemiyor. Bu bir hata.

Şimdi bunu düzeltip doğru sorgumuzu yazalım.

SELECT CurrencyRateID, FromCurrencyCode, ToCurrencyCode 
FROM Sales.CurrencyRate WHERE CurrencyRateID NOT IN 
(SELECT CurrencyRateID FROM Sales.SalesOrderHeader WHERE CurrencyRateID IS NOT NULL)

2013022605

Görüldüğü üzere sorgumu bu sefer doğru ifade ettim. Yani NULL değere eşit olmayan koşulunu eklememiz ile birlikte sorun çözüldü. WHERE deyimini bir alt sorgu olarak kullanmak oldukça sıkça yapılan bir işlemdir. T-SQL kodlarında bunu çok çok fazla kullanacaksınız yalnız burda da görüldüğü üzere her zaman NULL değerleri göz önüne alın, sorgunuzu buna göre oluşturun.

Bir cevap yazın

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