SQL Server’da Birden Fazla Satırı Tek Bir Ayırıcı Alana Verimli Bir Şekilde Join
Etme
Veritabanı yönetiminde, özellikle de SQL Server gibi ilişkisel veritabanlarıyla çalışırken, genellikle birden fazla satırı tek bir alanda birleştirmeniz gereken durumlarla karşılaşırsınız; bu daha iyi okunabilirlik ve daha basit işleme için gereklidir. Bu blog yazısında, bu sorunu SQL Server işlevlerini kullanarak nasıl çözeceğinizi, istenen sonucu göstererek ve farklı SQL Server sürümleri için etkili çözümler sunarak ele alacağız.
Problem Durumu
İki tablonuz olduğunu düşünün: Vehicles
ve Locations
. Bu tabloların nasıl göründüğüne dair hızlı bir örnek:
Araçlar Tablosu
VehicleID | Name |
---|---|
1 | Chuck |
2 | Larry |
Lokasyonlar Tablosu
LocationID | VehicleID | City |
---|---|---|
1 | 1 | New York |
2 | 1 | Seattle |
3 | 1 | Vancouver |
4 | 2 | Los Angeles |
5 | 2 | Houston |
Amaç, her aracın adını yanında ilişkili lokasyonlarının bir listesiyle göstermektir. İstenilen sonuç aşağıdaki gibi görünmelidir:
VehicleID | Name | Locations |
---|---|---|
1 | Chuck | New York, Seattle, Vancouver |
2 | Larry | Los Angeles, Houston |
Bunu karmaşık sorgular ve kodlama ile elde edebilseniz de, süreci basitleştiren bir çözüme ihtiyacımız var.
Çözüm: SQL Server İşlevlerini Kullanma
Yöntem 1: FOR XML PATH Kullanarak
Eğer SQL Server 2005 veya sonrası bir sürüm kullanıyorsanız, bu birleştirmeyi sağlamak için en etkili yöntemlerden biri FOR XML PATH
komutudur. İşte nasıl uygulayabileceğiniz:
SELECT [VehicleID],
[Name],
(STUFF((SELECT ', ' + [City] AS [text()]
FROM [Location]
WHERE (VehicleID = Vehicle.VehicleID)
FOR XML PATH('')), 1, 2, '')) AS Locations
FROM [Vehicle]
Açıklama:
- İçteki
SELECT
ifadesi herVehicleID
için lokasyonları alır ve bunları tek bir dizeye birleştirir. FOR XML PATH('')
, alt sorgudan dönen birden fazla satırı tek bir XML dizesine dönüştürmemizi sağlar.STUFF
, birleştirilmiş dizeden öndeki virgül ve boşluğu kaldırmak için kullanılır.
Yöntem 2: STRING_AGG Kullanarak (SQL Server 2017 ve Sonrası)
SQL Server 2017 veya daha yeni sürüm kullananlar için, bunu STRING_AGG
işlevini kullanarak daha basit bir şekilde elde etmenin bir yolu vardır. İşte görünümü:
SELECT [VehicleID],
[Name],
(SELECT STRING_AGG([City], ', ')
FROM [Location]
WHERE VehicleID = V.VehicleID) AS Locations
FROM [Vehicle] V
Açıklama:
STRING_AGG
iki argüman alır: toplamak istediğiniz sütun ve girişleri ayırmak için kullanmak istediğiniz ayırıcı. Bu, önceki yöntemden çok daha net ve verimlidir.
Sonuç
SQL Server’da birden fazla satırı tek bir ayırıcı alana birleştirmek, verilerinizin okunabilirliğini ve erişilebilirliğini önemli ölçüde artırabilir. İster eski bir sürümde FOR XML PATH kullanın, ister daha yeni sürümlerde STRING_AGG kullanın, SQL Server size verilerinizi verimli bir şekilde yönetmek için ihtiyaç duyduğunuz araçları sağlar.
Bu teknikleri anlayarak, SQL sorgularınızı basitleştirebilir ve gelecekte daha kolay okunabilir, sürdürülebilir ve değiştirilir hale getirebilirsiniz. Her zaman SQL Server sürümünüze ve özel gereksinimlerinize en uygun yöntemi seçin.
Bu yöntemlerle ilgili herhangi bir sorunuz veya daha fazla açıklamaya ihtiyacınız varsa, lütfen aşağıdaki yorumlarda sormaktan çekinmeyin!