13 Ekim 2010 Çarşamba

Sub Query

Subquery kısaca iç içe SELECT sorguları yazmak demektir. SQL dilinde  sütun değerlerini başka bir SELECT ifadesi sonucuyla karşılaştırmamıza olanak verir. SELECT ifadesi ile WHERE ifadesinin içine yeni bir SELECT ekleyerek bunu gerçekleştirebiliriz. Bir alt sorguda ka ilk SELECT komutu "dış sorgu", ikinci SELECT ifadesi ise " iç sorgu" yu oluşturur. İç sorgular her zaman ilk önce değerlendirilmelidir çünkü dış sorgular iç sorguların değerlerini kullanmaktadırlar.

Alt Sorgularda aşağıdaki operatörleri kullanabiliriz.
• Karşılaştırma Operatörleri
• IN Operatörü
• EXISTS Fonksiyonu
• ANY ve ALL Operatörleri


SELECT SC.SubCategoryName,P.*
FROM Production.Product P
JOIN (SELECT SC.ProductSubcategoryID,SC.Name SubCategoryName
      FROM Production.ProductSubcategory SC
      WHERE Name IN ('Road Frames','Mountain Frames')
      ) SC ON SC.ProductSubcategoryID = P.ProductSubcategoryID 

Yukarıda ki kod bir SubQuery'dir. İç içe yazılmış Join ve Selectlerden oluşur. Alt sorguda Name alanı Road Frames ve Mountain Frames olan verilerin ProductSubcategoryID ve Name alanlarıyla ilk sorguda da  tüm alanları joinle bağlayarak ekrana getirir.

SELECT *
FROM Production.Product P
WHERE P.ProductSubcategoryID
IN (
    SELECT ProductSubcategoryID
    FROM Production.ProductSubcategory
    WHERE Name IN ('Road Frames','Mountain Frames')
    )


Yukarıda ki kodun sonucu, ilk örnekte Joinle yapılan kodla aynıdır. Burada alt sorguda ilk sorgu ile ikinci sorguyu WHERE ve IN komutları ile bağlamıştır. Alt sorgu da Name alanında ki Road Frames ve Mountain Frames olan verilerin ProductSubcategoryID ilk sorguda ki  ProductSubcategoryID ile aynıysa tüm alanları ekrana getirecektir.

SELECT *
FROM Production.Product P
WHERE EXISTS (SELECT *
              FROM Production.ProductSubcategory SC
              WHERE Name IN ('Road Frames','Mountain Frames')
              AND P.ProductSubcategoryID =SC.ProductSubcategoryID
              )

Exists ile oluşturduğumuz bu kodda diğer iki kod ile aynı sonucu verir. Alt sorguda verilen komut gerçekleşiyorsa ilk sorgu ile birleştirip bizlere sonucu getirir.

1 yorum:

  1. Tekrarlayan kayıtları engellemek için distinct kullanıyorum fakat sorgu sonucunda sadece 1 column görünüyor.
    select distinct alan1 from tablom yaptığımda sonuç sadece alan1deki tekrarlayan kayıtlar dışında olanlar geliyor ama tablom 4 kolondan oluşuyor
    alan1 alan2 alan3 alan4 görünmesini ve sadece diğer satırlarda tekrar eden alan1lerin çıkartılmasını istiyorum nasıl yapabilirim yardımlarınızı bekliyorum.

    YanıtlaSil