SQL Server’da CROSS APPLY Kullanmak

Herkese merhaba. Bu yazıda SQL Server’da CROSS APPLY kullanmak ile ilgili bilgi paylaşacağım

SQL Server’da CROSS APPLY, bir tablodan veya sorgudan elde edilen verileri diğer bir tablo veya sorgu üzerinde uygulama işlemine olanak tanıyan bir JOIN operatörüdür. CROSS APPLY, OUTER APPLY gibi SQL Server’ın T-SQL dilinde yer alan APPLY operatörlerinden biridir.

SQL Server’da CROSS APPLY operatörü, JOIN operatörüne benzer bir şekilde, iki tablo arasında bir ilişki kurar. Ancak, CROSS APPLY operatörü, JOIN operatöründen farklı olarak, sağ tablodaki her kaydı sol tablodaki her kayıtla eşleştirir. Bu nedenle, sol tablodaki her kayıt, sağ tablodaki eşleşen kayıtlarla birlikte gösterilir.

SQL Server’da CROSS APPLY, özellikle bir tablonun her bir satırına bağlı olan bir alt sorgu veya fonksiyon kullanırken yararlıdır. Örneğin, bir tablodaki her bir satırın bir hesaplama veya dönüştürme işlemine tabi tutulması gereken bir senaryoda CROSS APPLY kullanılabilir. Bu işlemi gerçekleştirmek için, bir tablodaki her bir satırı almak üzere bir sorgu yazılır ve bu sorgu, diğer bir tabloya uygulanır.

SQL Server’da CROSS APPLY operatörü, bir tablodan elde edilen verileri, diğer bir tablo veya sorguda kullanmak için uygulama işlemi yapar. Bu operatör, JOIN operatörüne benzer bir şekilde çalışır, ancak her kaydı diğer tablodaki her kayıtla eşleştirir. Bu nedenle, CROSS APPLY, özellikle bir tablonun her bir satırıyla ilgili olan işlemler yaparken yararlıdır.

SQL Server’da CROSS APPLY, genel olarak bir tabloyu tablo değerli bir ifadeyle veya tablo döndüren kullanıcı tanımlı bir fonkiyonla birleştirmek için kullanılabilen güçlü bir işleçtir. Karmaşık hesaplamalar yapmanızı, verilerin özetini çıkarmanızı ve tabloları daha verimli bir şekilde birleştirmenizi sağlar.

CROSS APPLY’ı anlamak için aşağıdaki tabloyu oluşturup sorguyu inceleyelim.

CREATE TABLE Musteriler (
	MusteriID INT PRIMARY KEY
   ,MusteriAdi NVARCHAR(50)
   ,MusteriSoyadi NVARCHAR(50)
   ,Sehir NVARCHAR(50)
);

CREATE TABLE Siparisler (
	SiparisID INT PRIMARY KEY
   ,MusteriID INT
   ,SiparisTarihi DATE
   ,FOREIGN KEY (MusteriID) REFERENCES Musteriler (MusteriID)
);


INSERT INTO Musteriler (MusteriID, MusteriAdi, MusteriSoyadi, Sehir)
	VALUES (1, 'Ali', 'Yilmaz', 'Istanbul'),
	(2, 'Ayse', 'Demir', 'Ankara'),
	(3, 'Mehmet', 'Ozturk', 'Istanbul'),
	(4, 'Zeynep', 'Ozkan', 'Izmir'),
	(5, 'Mustafa', 'Gunes', 'Ankara');

INSERT INTO Siparisler (SiparisID, MusteriID, SiparisTarihi)
	VALUES (1, 1, '2022-03-01'),
	(2, 1, '2022-03-05'),
	(3, 2, '2022-03-07'),
	(4, 4, '2022-03-10'),
	(5, 3, '2022-03-12'),
	(6, 2, '2022-03-15'),
	(7, 1, '2022-03-17'),
	(8, 5, '2022-03-20');

SELECT
	M.MusteriAdi
   ,M.MusteriSoyadi
   ,S.SiparisTarihi
FROM Musteriler AS M
CROSS APPLY (SELECT TOP 2
		*
	FROM Siparisler AS S
	WHERE S.MusteriID = M.MusteriID
	ORDER BY SiparisTarihi DESC) AS S;

SQL Server'da CROSS APPLY Kullanmak

Yukarıdaki, sorgu, Musteriler tablosundaki her bir müşteri için son iki siparişi listeleyecektir. CROSS APPLY operatörü, her bir müşterinin son iki siparişini belirlemek için bir alt sorgu kullanır. Bu alt sorgu, Siparisler tablosundan müşteriye ait son iki siparişi getirir ve bu siparişleri tarihe göre tersten sıralar. Daha sonra, CROSS APPLY operatörü, Musteriler tablosundaki her bir müşteriyle bu alt sorguyu birleştirir ve sonuç olarak her bir müşterinin son iki siparişi listelenir.

Yukarıdaki sorgu biraz karmaşık gelebilir. Bunu da tablo döndüren fonksiyon kullanarak aşabiliriz. İlk olarak aşağıdaki fonksiyonu oluşturalım.

CREATE FUNCTION dbo.fnGetOrders (@musteriID INT)
RETURNS TABLE
AS
	RETURN
	(
	SELECT TOP 2
		SiparisID
	   ,MusteriID
	   ,SiparisTarihi
	FROM Siparisler
	WHERE MusteriID = @musteriID
	ORDER BY SiparisTarihi DESC
	);

Şimdi bu fonksiyonu CROSS APPLY ifadesi ile birlikte kullanalım.

SELECT
	M.MusteriAdi
   ,M.MusteriSoyadi
   ,S.SiparisTarihi
FROM Musteriler AS M
CROSS APPLY dbo.fnGetOrders(M.MusteriID) AS S;

SQL Server'da CROSS APPLY Kullanmak

Yukarıdaki sorgu da, Musteriler tablosundaki her bir müşteri için son iki siparişi listeleyecektir. CROSS APPLY operatörü, dbo.fnGetOrders fonksiyonunu her bir müşteri için çağırarak sonuçları döndürür. Bu fonksiyon, Siparisler tablosundan müşteriye ait son iki siparişi getirir ve bu siparişleri tarihe göre tersten sıralar. Daha sonra, CROSS APPLY operatörü, Musteriler tablosundaki her bir müşteriyle bu fonksiyonu birleştirir ve sonuç olarak her bir müşterinin son iki siparişi listelenir.

SQL Server’da CROSS APPLY, her bir kaydı bir tablodan diğer tabloya bağımlılığı olan bir işlem veya alt sorgu üzerinden işleme izin veren bir JOIN operatörüdür. CROSS APPLY genellikle, bir sorgu içinde bir alt sorgu kullanarak, ana sorgu sonuç kümesini daha fazla işlemek veya genişletmek için kullanılır. Bu alt sorgu, CROSS APPLY operatörü tarafından her kayıt için ayrı ayrı çalıştırılır ve sonuçları ana sorguya döndürülür.

SQL Server’da CROSS APPLY operatörü, INNER JOIN ve OUTER JOIN operatörleriyle benzerlik gösterir, ancak bu işlemlerden farklı olarak, her bir kayıt için alt sorgunun çalıştırılması zorunlu olduğu için performans açısından daha yüksek bir maliyeti olabilir. Sorgu sonuçlarınızın performasını inceleyerek maliyeti ve performansı analiz edebilirsiniz.

SQL Server’da CROSS APPLY, bir tablodan diğer tabloya bağımlı olan karmaşık sorguların yazılmasına izin verir. Örneğin, bir tablodaki her bir kayıtın başka bir tablodaki bir veya daha fazla ilgili kayıtla birleştirilmesi gerektiğinde kullanılabilir. Ayrıca, alt sorgularda kullanılan fonksiyonlar gibi işlevlerin kullanımını da içerebilir.

SQL Server’da CROSS APPLY genellikle, veritabanı tasarımında oluşturulmuş karmaşık yapıları işlemek için kullanılır ve özellikle büyük veri kümeleri üzerinde çalışırken daha etkilidir.

Linkteki kaynağı da okuyabilirsiniz : https://www.c-sharpcorner.com/UploadFile/f0b2ed/cross-apply-and-outer-apply-in-sql-server/

Herkese çalışma hayatında ve yaşamında başarılar kolaylıklar.

463 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!