SQL Server ile ilgili her şey.

SQL Server’da Cross Apply Kullanımı

S

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.

SQL Server Eğitimleri Kanalına Abone Olun

Yazar Hakkında

Yavuz Selim Kart

SQL Server tarafında kendini ilerletmeye çalışırken bildiklerini sürekli başkalarına aktaran, yazılım dünyasında (C#, Java, Python vb.) kendini güncel tutmaya çalışan, araştırma yapmaktan bıkmayan, meraklı, bilginin üzerine bilgi katmaktan mutluluk duyan bir yazılım eğitmeni ve kod sever.
Grafik tasarım dünyasında Indesign'ı anlatacak kadar iyi kullanabilen, Photoshop ve Illustrator'e de orta düzey hakimiyeti bulunan, internet üzerinde online kimya dergisi kurmuş ve bunu yüzbinlerce kişiye ulaştırmayı başaran bir grafik sever.
WordPress tarafında 5 adet web sitesi kurmuş, bu sistemler üzerine çalışan bir WordPress sever.
Sosyal medya üzerinde okumalara ve araştırmalara devam eden, kendi kurmuş olduğu kimya dergisini daha çok kişiye nasıl ulaştırırım diye düşünen ve bu konuda SEO çalışmaları üzerine kafa yoran bir Sosyal Medya sever.
Kısaca çok çalışmayı seven, azimli biriyim.

Yavuz Selim Kart
SQL Server ile ilgili her şey.

Yazar

Yavuz Selim Kart

SQL Server tarafında kendini ilerletmeye çalışırken bildiklerini sürekli başkalarına aktaran, yazılım dünyasında (C#, Java, Python vb.) kendini güncel tutmaya çalışan, araştırma yapmaktan bıkmayan, meraklı, bilginin üzerine bilgi katmaktan mutluluk duyan bir yazılım eğitmeni ve kod sever.
Grafik tasarım dünyasında Indesign'ı anlatacak kadar iyi kullanabilen, Photoshop ve Illustrator'e de orta düzey hakimiyeti bulunan, internet üzerinde online kimya dergisi kurmuş ve bunu yüzbinlerce kişiye ulaştırmayı başaran bir grafik sever.
WordPress tarafında 5 adet web sitesi kurmuş, bu sistemler üzerine çalışan bir WordPress sever.
Sosyal medya üzerinde okumalara ve araştırmalara devam eden, kendi kurmuş olduğu kimya dergisini daha çok kişiye nasıl ulaştırırım diye düşünen ve bu konuda SEO çalışmaları üzerine kafa yoran bir Sosyal Medya sever.
Kısaca çok çalışmayı seven, azimli biriyim.