วิธีการ รวม
หลายแถวใน 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 ของคุณและความต้องการเฉพาะของคุณเสมอ
หากคุณมีคำถามหรือจำเป็นต้องมีการชี้แจงเพิ่มเติมเกี่ยวกับวิธีการเหล่านี้ โปรดถามในความคิดเห็นด้านล่าง!