SQL Server’da Cross Apply Kullanımı
Herkese merhaba,
Bu yazıda size SQL Server’da Cross Apply kullanımından bahsedeceğim.
SQL Server’da ikinci bir tabloyla join işlemi yapmak istiyoruz ve eşleşen ilk kaydın gelmesini istiyorsak bu durumda Top 1 ifadesini kullanamazsınız. Böyle işlemlerde Cross Apply kullanımı işimize yarayacaktır. Cross Apply ifadesini fonksiyonlar ile de kullanabiliyoruz. Örnek kodları aşağıda görmektesiniz.
--Birinci Örnek --Tablo oluşturulması CREATE TABLE Bolumler( BolumID [int] NOT NULL PRIMARY KEY, BolumAd VARCHAR(250) NOT NULL, ) --Tablo içerisine veri eklenmesi INSERT Bolumler (BolumID, BolumAd) VALUES (1, N'Mühendis') INSERT Bolumler (BolumID, BolumAd) VALUES (2, N'Yönetici') INSERT Bolumler (BolumID, BolumAd) VALUES (3, N'Satış') INSERT Bolumler (BolumID, BolumAd) VALUES (4, N'Pazarlama') INSERT Bolumler (BolumID, BolumAd) VALUES (5, N'Finans') GO --Tablo oluşturulması CREATE TABLE Calisanlar( CalisanID [int] NOT NULL PRIMARY KEY, Ad VARCHAR(250) NOT NULL, Soyad VARCHAR(250) NOT NULL, BolumID [int] NOT NULL REFERENCES Bolumler(BolumID), ) GO --Tablo içerisine veri eklenmesi INSERT Calisanlar (CalisanID, Ad, Soyad, BolumID) VALUES (1, N'Yavuz', N'Selim', 1 ) INSERT Calisanlar (CalisanID, Ad, Soyad, BolumID) VALUES (2, N'Selim', N'Yavuz', 2 ) INSERT Calisanlar (CalisanID, Ad, Soyad, BolumID) VALUES (3, N'Bilge', N'Nuray', 3 ) INSERT Calisanlar (CalisanID, Ad, Soyad, BolumID) VALUES (4, N'Hasan', N'Bilge', 3 ) --Cross Apply Kullanımı (Inner Join'e benzeyen bir yapı, temel Kullanım bu şekilde) SELECT * FROM Bolumler B CROSS APPLY ( SELECT * FROM Calisanlar C WHERE C.BolumID = B.BolumID ) A GO --Inner Join Kullanımı SELECT * FROM Bolumler B INNER JOIN dbo.Calisanlar C ON B.BolumID = C.BolumID GO --Bir miktar daha veri ekleyelim INSERT Calisanlar (CalisanID, Ad, Soyad, BolumID) VALUES (5, N'Meral', N'Bilmez', 1 ) INSERT Calisanlar (CalisanID, Ad, Soyad, BolumID) VALUES (6, N'Ayhan', N'Çalışkan', 2 ) INSERT Calisanlar (CalisanID, Ad, Soyad, BolumID) VALUES (7, N'Suna', N'Karışmaz', 3 ) INSERT Calisanlar (CalisanID, Ad, Soyad, BolumID) VALUES (8, N'Mehtap', N'Gün', 3 ) INSERT Calisanlar (CalisanID, Ad, Soyad, BolumID) VALUES (9, N'Kaya', N'Yılmaz', 1 ) INSERT Calisanlar (CalisanID, Ad, Soyad, BolumID) VALUES (10, N'Süha', N'Durmaz', 2 ) INSERT Calisanlar (CalisanID, Ad, Soyad, BolumID) VALUES (11, N'Mustafa', N'Kalmaz', 3 ) INSERT Calisanlar (CalisanID, Ad, Soyad, BolumID) VALUES (12, N'İsmail', N'Bilmez', 3 ) --Bölümlere göre ilk sıradaki kayıtları çekme ihtiyacı oldu diyelim SELECT B.BolumAd,A.Ad FROM Bolumler B CROSS APPLY ( SELECT TOP 1 * FROM Calisanlar C WHERE C.BolumID = B.BolumID ) A GO --Bölümlere göre ilk sıradaki kayıtları çekme ihtiyacı oldu diyelim --Ad kısmına göre tersten yani Z'den A'ya sıralama için --(Fotoğrafı inceleyin ve fotoğrafın altındaki kodları çalıştırarak anlamaya çalışın) SELECT B.BolumAd,A.Ad FROM Bolumler B CROSS APPLY ( SELECT TOP 1 * FROM Calisanlar C WHERE C.BolumID = B.BolumID ORDER BY C.Ad DESC ) A GO --Sıralamayı anlamak için bu sorgu ile üstteki sorguyu beraber çalıştırın SELECT * FROM Bolumler B CROSS APPLY ( SELECT * FROM Calisanlar C WHERE C.BolumID = B.BolumID ) A GO --Fonksiyonlu şekilde de yazabiliriz. --Bölümlere göre ilk sıradaki kayıtları çekme ihtiyacı oldu diyelim Create FUNCTION BolumlereGoreIlkKayıt(@BolumID int) RETURNS TABLE AS RETURN SELECT TOP 1 B.BolumID,B.BolumAd,c.Ad FROM Bolumler B INNER JOIN dbo.Calisanlar C ON C.BolumID = B.BolumID WHERE b.BolumID=@BolumID GO --Kullanımı aşağıdaki şekilde. Bölümlere göre ad soyad çekme işlemini bu şekilde yaptık SELECT * FROM Bolumler SELECT * FROM Bolumler CROSS APPLY dbo.BolumlereGoreIlkKayıt(BolumID) as Sonuc --Anlamak için aşağıdaki kodu inceleyelim. --Görüldüğü gibi yukarıdaki kod aşağıdaki kodun dinamik şekli gibidir. SELECT TOP 1 B.BolumID,B.BolumAd,c.Ad FROM Bolumler B INNER JOIN dbo.Calisanlar C ON C.BolumID = B.BolumID WHERE b.BolumID=1 UNION SELECT TOP 1 B.BolumID,B.BolumAd,c.Ad FROM Bolumler B INNER JOIN dbo.Calisanlar C ON C.BolumID = B.BolumID WHERE b.BolumID=2 UNION SELECT TOP 1 B.BolumID,B.BolumAd,c.Ad FROM Bolumler B INNER JOIN dbo.Calisanlar C ON C.BolumID = B.BolumID WHERE b.BolumID=3
Yukarıdaki kodlarda görüldüğü üzere Cross Apply kullanarak bölümlere göre ilk sıradaki kayıtları çekmiş olduk ve bu işlemi fonksiyon ile de yapma imkanı bulabildik. Cross Apply, Cross Apply’dan dönen sonuçları kolonları ile beraber diğer tablo içine transfer etmede kullanılır. Aşağıdaki fotoğrafta bunu ayrıntılı görebilirsiniz.
Cross 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.