Sayfalar

Translate

24 Nisan 2015 Cuma

SQL Server - CROSS APPLY, OUTER APPLY - Performans

Bir sorguda ikinci bir tabloya JOIN yapmak istiyoruz yalnız o tablodan sadece eşleşen ilk kaydın gelmesini istiyoruz.

INNER JOIN yada LEFT JOIN de TOP 1 koyamıyoruz. CROSS APPLY ve OUTER APPLY yardımımıza yetişiyor.

CROSS APPLY -> INNER JOIN in dengi ve performansları aynı
OUTER APPLY -> LEFT JOIN in dengi ve performansları aynı

Örneğin Müşteri kayıtlarını tuttuğumuz bir tablomuz(Musteriler) ve müşterilerin hareketlerini logladığımız ikinci bir tablomuz(MusteriHareketLog) olsun.

Musteri tablomuzun verileri aşağıdaki gibi osun;

ID  MusteriIsmi
1    Ahmet ASLAN
2    Orhan YILMAZ
3    Sevim KOKMAZ
...

MusteriHareketLog tablomuzun verileri de aşağıdaki gibi osun;

ID  HaraketIsmi MusteriID   TarihSaat
1    Giris               1                   2015-04-20 15:00
2    İşlem1            1                   2015-04-20 15:01
3    Giris               3                   2015-04-21 16:00
4    İşlem2            3                   2015-04-21 16:05
5    Giris               2                   2015-04-23 11:30
6    İşlem3            2                   2015-04-23 11:32

Müşterilerin listesini almak istiyoruz ve bu listede son yaptığı işlemin tarih ve saatini de görmek istiyoruz. Eğer müşteri ve MusteriHareketLog tablolarını JOIN lersek bütün logları listelemiş oluruz. Bu bizim istediğimiz değil, istediğimiz liste için aşağıdaki gibi bir sorgu yazmamız yeterli oluyor


SELECT *  FROM Musteri M WITH(NOLOCK)
CROSS APPLY(
                                SELECT TOP 1 TarihSaat FROM MusteriHareketLog L WITH(NOLOCK)
                                WHERE L.MusteriID = M.ID ORDER BY TarihSaat DESC
                           ) T

Hiç yorum yok:

Yorum Gönder