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 her VehicleID 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!