วิธีการ รวม หลายแถวใน SQL Server ให้เป็นฟิลด์เดียวที่มีตัวแบ่ง

ในงานจัดการฐานข้อมูล โดยเฉพาะเมื่อจัดการกับฐานข้อมูลเชิงสัมพันธ์เช่น SQL Server คุณมักจะพบสถานการณ์ที่คุณต้อง รวมหลายแถว เป็นฟิลด์เดียวเพื่อให้ง่ายต่อการอ่านและการประมวลผลที่ง่ายขึ้น บทความนี้จะกล่าวถึงวิธีแก้ปัญหานี้โดยใช้ฟังก์ชันใน SQL Server โดยแสดงผลลัพธ์ที่ต้องการและวิธีการที่มีประสิทธิภาพสำหรับเวอร์ชันต่างๆ ของ SQL Server

คำถามปัญหา

ลองนึกภาพว่าคุณมีตารางสองตาราง: Vehicles และ Locations นี่คือตัวอย่างเกี่ยวกับตารางเหล่านี้:

ตาราง Vehicles

VehicleID Name
1 Chuck
2 Larry

ตาราง Locations

LocationID VehicleID City
1 1 New York
2 1 Seattle
3 1 Vancouver
4 2 Los Angeles
5 2 Houston

เป้าหมายคือการดึงข้อมูลในลักษณะที่แสดงชื่อของแต่ละรถยนต์พร้อมกับรายการของสถานที่ที่เกี่ยวข้องกับรถนั้น ผลลัพธ์ที่ต้องการควรมีลักษณะดังนี้:

VehicleID Name Locations
1 Chuck New York, Seattle, Vancouver
2 Larry Los Angeles, Houston

ในขณะที่คุณสามารถทำเช่นนี้ได้ด้วยการเขียนคำสั่งที่ซับซ้อนและโค้ด แต่เราต้องการวิธีการที่ทำให้กระบวนการนี้ง่ายขึ้น

วิธีการ: การใช้ฟังก์ชัน SQL Server

วิธีที่ 1: ใช้ FOR XML PATH

หากคุณใช้ SQL Server 2005 หรือเวอร์ชันที่ใหม่กว่า หนึ่งในวิธีที่มีประสิทธิภาพที่สุดในการทำการต่อเนื่องนี้คือคำสั่ง FOR XML PATH ดังนี้คือวิธีการที่คุณสามารถนำไปใช้:

SELECT [VehicleID],
       [Name],
       (STUFF((SELECT ', ' + [City] AS [text()]
                FROM [Location]
                WHERE (VehicleID = Vehicle.VehicleID)
                FOR XML PATH('')), 1, 2, '')) AS Locations
FROM [Vehicle]

คำอธิบาย:

  • คำสั่ง SELECT ภายในจะดึงสถานที่สำหรับแต่ละ VehicleID และทำการรวมพวกมันเข้าเป็นสตริงเดียว
  • FOR XML PATH('') ช่วยให้เราสร้างสตริง XML เดียวจากหลายแถวที่ได้จากการค้นหาย่อย
  • STUFF ใช้เพื่อลบคอมม่าที่อยู่ข้างหน้าและช่องว่างจากสตริงที่รวมอยู่

วิธีที่ 2: ใช้ STRING_AGG (SQL Server 2017 และใหม่กว่า)

สำหรับผู้ที่ใช้ SQL Server 2017 หรือใหม่กว่า มีวิธีที่ง่ายกว่าในการทำเช่นนี้โดยใช้ฟังก์ชัน STRING_AGG นี่คือวิธีการ:

SELECT [VehicleID],
       [Name],
       (SELECT STRING_AGG([City], ', ')
        FROM [Location]
        WHERE VehicleID = V.VehicleID) AS Locations
FROM [Vehicle] V

คำอธิบาย:

  • STRING_AGG รับสองอาร์กิวเมนต์: คอลัมน์ที่คุณต้องการรวมกัน และตัวแบ่งที่คุณต้องการใช้เพื่อแยกข้อมูล มันชัดเจนและมีประสิทธิภาพมากกว่าวิธีก่อนหน้า

บทสรุป

การรวมหลายแถวให้เป็นฟิลด์เดียวที่มีตัวแบ่งใน SQL Server สามารถเพิ่มความสามารถในการอ่านและการเข้าถึงข้อมูลของคุณได้อย่างมีนัยสำคัญ ไม่ว่าคุณจะใช้เวอร์ชันเก่าที่ใช้ FOR XML PATH หรือคุณสามารถใช้ STRING_AGG ในเวอร์ชันใหม่ SQL Server มีเครื่องมือที่คุณต้องการเพื่อจัดการข้อมูลของคุณอย่างมีประสิทธิภาพ

ด้วยการเข้าใจเทคนิคเหล่านี้ คุณสามารถทำให้คำสั่ง SQL ของคุณง่ายขึ้น ทำให้มันอ่านง่าย ดูแลรักษาและปรับเปลี่ยนในอนาคตได้ง่ายขึ้น เลือกวิธีการที่เหมาะสมที่สุดกับเวอร์ชัน SQL Server ของคุณและความต้องการเฉพาะของคุณเสมอ

หากคุณมีคำถามหรือจำเป็นต้องมีการชี้แจงเพิ่มเติมเกี่ยวกับวิธีการเหล่านี้ โปรดถามในความคิดเห็นด้านล่าง!