SQL Server’da Cross Apply Kullanımı

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.

870 Kez Okundu

Yavuz Selim Kart

Yazılım ve veri tabanında bildiklerimi anlatmaya gayret ediyorum. Halen birçok programlama dili üzerinde araştırmalar yaparak kendimi geliştiriyorum. Bunlar haricinde Grafik Tasarım ve Wordpress konularına da ilgim bulunmakta. SEO ve Sosyal medya yönetimleri hakkında da bilgim mevcuttur. Kısaca çok çalışmayı seven azimli biriyim.

You may also like...

Yazı kopyalamak yasaktır!