SQL Server’da Outer Apply Kullanımı
Herkese merhaba,
Bu yazıda size SQL Server’da Outer Apply kullanımından bahsedeceğim.
SQL Server’da ikinci bir tabloyla join işlemi yapmak istiyoruz ve eşleşen kayıtlarda son iki kaydın gelmesini istiyorsak bu gibi durumlarda Top 2 ifadesini kullanamayız. Böyle işlemlerde Outer Apply kullanımı işimize yarayacaktır. Outer Apply ifadesini fonksiyonlar ile de kullanabiliyoruz. Örnek kodları aşağıda görmektesiniz.
--OuterApply ile ilgili database oluşturma CREATE DATABASE OuterApplyOrnekDatabase GO USE OuterApplyOrnekDatabase GO --Müşteriler tablosu oluşturma CREATE TABLE Musteriler ( MusteriID INT , MusteriAd VARCHAR(50) ) GO --Müşteriler tablosuna veri ekleme INSERT INTO Musteriler ( MusteriID, MusteriAd ) VALUES ( 1, 'Yavuz' ), ( 2, 'Pelin' ), ( 3, 'Fevziye' ) GO --Sipariş tablosu oluşturma CREATE TABLE Siparisler ( SiparisID INT , MusteriID INT , Ucret MONEY , SiparisTarihi DATETIME ) GO --Siparişler tablosuna veri ekleme INSERT INTO Siparisler ( SiparisID, MusteriID, Ucret, SiparisTarihi ) VALUES ( 100, 1, 100.0, GETDATE() - 30 ), ( 101, 1, 200.0, GETDATE() - 20 ), ( 103, 1, 300.0, GETDATE() - 10 ), ( 104, 2, 150.0, GETDATE() ) GO --Müşterinin son iki siparişini gösteren fonksiyon oluşturmak CREATE FUNCTION dbo.MusterininSonIkiSiparisi ( @MusteriID AS INT ) RETURNS TABLE AS RETURN ( SELECT TOP 2 * FROM dbo.Siparisler s WHERE s.MusteriID = @MusteriID ORDER BY s.SiparisTarihi DESC ) --1 numaralı müşteri idsinin son iki siparişi SELECT * FROM dbo.MusterininSonIkiSiparisi(1) --Müşteriler ve siparişlerinin listelenmesi SELECT * FROM Musteriler M LEFT OUTER JOIN dbo.Siparisler S ON M.MusteriID = S.MusteriID --Outer Apply kullanarak müşteriler ve siparişlerin listelenmesi SELECT * FROM Musteriler M OUTER APPLY (SELECT * FROM dbo.Siparisler S WHERE M.MusteriID = S.MusteriID) T --Outer Apply ile fonksiyon Kullanarak son iki siparişin listelenmesi SELECT * FROM dbo.Musteriler M OUTER APPLY dbo.MusterininSonIkiSiparisi(M.MusteriID) O --Outer Apply ile fonksiyon kullanılmadan son iki siparişin listelenmesi SELECT * FROM dbo.Musteriler M OUTER APPLY (SELECT TOP 2 * FROM Siparisler S WHERE M.MusteriID = S.MusteriID ORDER BY S.SiparisTarihi DESC) T
Yukarıdaki kodlarda müşteri ve sipariş tabloları oluşturduk. Bu iki tablo MusteriID ile birbirine bağlı. Müşterilerin verdiği son iki siparişi göstermek istiyoruz. Bu işlem için tablolarımızı birbirine bağlamamız gerekli. Left Outer Join ile bu işlemi yapınca her bir müşteri için siparişler listelendi. Son iki sipariş için ise Top ifadesini kullanmamız gerekli. Burada kodumuzu revize ederek Outer Apply ifadesini kullanıyoruz. Alt sorgu biçiminde ikinci sorgumuzu Outer Apply ifadesinden sonra yazıyoruz. MüşteriID kısımları ile sorgumuza Join işlemi yaptığımız zaman her bir müşteri için yapılmış olan son iki siparişin listelendiğini göreceksiniz. Sorguyu direkt yazabileceğiniz gibi bir fonksiyon oluşturup fonksiyonu sorgu içinde kullanarak da Outer Apply işlemini gerçekleştirebilirsiniz.
Outer Apply kullanımını daha çok örnek ve uygulama yaparak pekiştirebilirsiniz.
Herkese çalışma hayatında ve yaşamında başarılar kolaylıklar.