İlişkili Alt Sorgular Yazmak – Bölüm 33

Önceki bölümde, iç sorgunun dış sorgudan bağımsız olarak bir kez çalıştırılıp sonuçları dış sorguya döndürdüğü bağımsız alt sorguların nasıl yazıldığını öğrendik. Microsoft SQL Server’da, iç sorgunun dış sorgudan input alarak kavramsal olarak her satırda çalışan ilişkili alt sorgular yazılabilmektedir. Bu bölümde ilişkili alt sorguların nasıl yazıldığının yanı sıra bazı türlerini ve bunları performans ve mantıksal verimlilik açısından JOIN kullanarak yeniden tanımlamayı da öğreneceğiz.

İlişkili Alt Sorgularla Çalışmak

Bağımsız alt sorgular gibi, ilişkili alt sorgular da bir dış sorguda bulunan iç içe SELECT ifadeleridir. Tek değer veya çok değerli alt sorgular şeklinde de olabilirler. Bu sorgu türünde tipik olarak dış sorgudan iç sorguya bir değer gönderilir ve iç sorguda parametre olarak kullanılır. Bağımsız alt sorgulardan farklı olarak, değerlerin alt sorguya parametre olarak geçirilmesi dış sorguya bağlıdır. Bu durumda bazı özel hususlar ortaya çıkmaktadır:

  • İlişkili alt sorgular, dış sorgudan ayrı olarak çalıştırılamaz. Bu durum test ve hata ayıklamayı zorlaştırır.
  • Bir kez işlenen bağımsız alt sorguların aksine, ilişkili alt sorgular birçok kez çalışır. Mantıksal olarak, dış sorgu ilk önce çalışır ve dönen her sonuç satırı için iç sorgu çalışır.

Aşağıdaki sorguda, siparişleri her çalışan için en son sipariş tarihiyle çekmek için ilişkili alt sorgu kullanılmıştır. Alt sorgu, dış sorgudan bir input değeri kabul eder, dış sorguya skaler bir sonuç döndürür ve bu sonuç dış sorguda WHERE ifadesinde işlenir. Sonraki açıklamalarda kullanılmak üzere satır numaraları eklenmiştir, mantıksal işlem sırası değildir:

1. SELECT orderid, empid, orderdate
2. FROM Sales.Orders AS O1
3. WHERE orderdate =
4. (SELECT MAX(orderdate)
5. FROM Sales.Orders AS O2
6. WHERE O2.empid = O1.empid)
7. ORDER BY empid, orderdate; 
Satır noİfadeAçıklama
1SELECT orderid, empid, orderdate Dış sorgudan iç sorguya gönderilen sütunlar.
2FROM Sales.Orders AS O1 Dış sorgunun kaynak tablosu. Takma adı belirtilmiştir.
3 WHERE orderdate = Dış sorgu satırlarını iç sorgunun sonucuna göre değerlendirmek için kullanılır.
4(SELECT MAX(orderdate) İç sorgu tarafından döndürülen sütun. Toplama işlevi skaler bir değer döndürür.
5FROM Sales.Orders AS O2 İç sorgu için kaynak tablosu. Takma adı belirtilmiştir.
6WHERE O2.empid = O1.empid) Dış sorgudaki empid ile iç sorgudaki empid arasındaki ilişkisi. Bu işlem dış sorgudaki her satır için sağlanır.
7ORDER BY empid, orderdate; Dış sorgu sonuçlarını sıralar.

Sorgu aşağıdaki sonuçları döndürür. Bazı çalışanlar aynı tarihte birden fazla sipariş hazırladığından birden fazla gözükmektedir:

orderid empid orderdate
----- ----- -----------------------
11077 1 2008-05-06 00:00:00.000
11073 2 2008-05-05 00:00:00.000
11070 2 2008-05-05 00:00:00.000
11063 3 2008-04-30 00:00:00.000
11076 4 2008-05-06 00:00:00.000
11043 5 2008-04-22 00:00:00.000
11045 6 2008-04-23 00:00:00.000
11074 7 2008-05-06 00:00:00.000
11075 8 2008-05-06 00:00:00.000
11058 9 2008-04-29 00:00:00.000 
İlişkili Alt Sorgu Yazmak

İlişkili alt sorgular yazarken aşağıdakileri göz önünde bulundurmakta fayda var:

  • İç sorgudan dönen sonuca uygun dış sorguyu yazın. İç sorgu skaler olacaksa, WHERE ifadesinde =, <,> ve <> gibi eşitlik ve karşılaştırma operatörleri kullanabilirsiniz. İç sorgu birden fazla değer döndürüyorsa IN predicate’i kullanın. NULL sonuçları göze alın.
  • Alt sorguya gönderilecek dış sorgudaki sütunu tanımlayın. Dış sorgudaki sütunun kaynağı olan tablo için bir takma ad tanımlayın.
  • İç tablodakiyle dış tablodaki karşılaştırılacak sütunu tanımlayın. Dış sorguda yaptığınız gibi kaynak tablo için de bir takma ad oluşturun.
  • Dış sorgudaki input değerine bağlı olan kaynaktan değerleri alan için iç sorguyu yazın. Örneğin, iç sorgunun WHERE ifadesinde dış sorgu sütununu kullanabilirsiniz.

İç ve dış sorgular arasındaki ilişki, karşılaştırma için dış sorgudaki değer iç sorguya iletildiğinde ortaya çıkar. Alt sorguya adını bu ilişki vermektedir.

Kaynak:
Correlated Subqueries

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir