4 Haziran 2012 Pazartesi

38. SUBQUERIES - JOIN Dönüşümü

  • Genel olarak ilişkili alt sorguları birer JOIN ifadesi yerine de kullanabiliriz. 
  • Aralarında sadece kullanım olarak farklılık bulunmaktadır. 
  • Sonuç olarak ise iki sorgudan da aynı sonucu elde ederiz.
Örnek: İlk sorgumuzda çalışanların hitap şekillerini 2 sorguda birbirine eşit olmayanların karşılaştırmasını yaptık. Yani IN ile bir liste alıp bunu kendi içinde eşit olmayanlarla karşılaştırdık.

Sorgu:
SELECT  DISTINCT E1.TitleOfCourtesy FROM Employees AS E1
WHERE E1.City IN
(SELECT E2.City FROM Employees AS E2 WHERE E1.TitleOfCourtesy<>E2.TitleOfCourtesy)



Örnek: Bu sorgumuzda üstteki örneğin JOIN işlemiyle yapılmış halidir.

Sorgu:
SELECT DISTINCT E1.TitleOfCourtesy FROM Employees AS E1
INNER JOIN Employees AS E2 WITH (NOLOCK) ON E1.City=E2.City
WHERE E1.TitleOfCourtesy<>E2.TitleOfCourtesy



Ders39'a Geçebilirsiniz.

2 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
  2. Merhaba Ayhan Bey, mantıksal olarak sql de gelen sonuc içinden benzersiz olanları istiyorsunuz.SQL değerlendirmeyi sonuç kümesindeki satırlara bakar.Yani 4 column gelirse 4 column değeride aynı olan varsa onları almaz sadece 1 columna göre kontrol yapmaz.Bunun için size önerim;
    select distinct city into #tmp from Employees
    declare @a varchar(20)
    while (exists(select city from #tmp))
    select top 1 @a=city from #tmp
    begin
    select top 1 lastname,firstname,Titleofcourtesy,t.city from employees as e
    inner join #tmp as t with (nolock) on t.city=e.city
    delete from #tmp where city=@a
    end
    drop table #tmp
    bu tarz kullanmakta ne kadar doğru verilerinize kalmıs.Çünkü burda listelediğim kişilerden city si farklı olanlardan 1 er tane alıyorum.Yani farklı isimde kişilerde olabilir onları almıyorum. Sizde bu şekilde yapabilirsiniz.Ama SQL in sonuc kumesindeki satırları benzersizlik için kıyasladığını unutmayız.

    YanıtlaSil