كيفية دمج عدة صفوف بكفاءة في SQL Server إلى حقل مفصول واحد

في إدارة قواعد البيانات، خاصة عند التعامل مع قواعد البيانات العلائقية مثل SQL Server، غالبًا ما تواجه سيناريوهات تحتاج فيها إلى دمج عدة صفوف في حقل واحد لتحسين القراءة وتبسيط المعالجة. سيتناول هذا المنشور كيفية حل هذه المشكلة باستخدام وظائف SQL Server، موضحًا النتيجة المرغوبة وحلول فعالة لنسخ SQL Server المختلفة.

بيان المشكلة

تخيل أن لديك جدولين: المركبات و المواقع. إليك مثال سريع حول ما تبدو عليه هذه الجداول:

جدول المركبات

VehicleID Name
1 تشوك
2 لاري

جدول المواقع

LocationID VehicleID City
1 1 نيويورك
2 1 سياتل
3 1 فانكوفر
4 2 لوس أنجلوس
5 2 هيوستن

الهدف هو استخراج البيانات بطريقة تعرض اسم كل مركبة إلى جانب قائمة بمواقعها المرتبطة. يجب أن تبدو النتيجة المرغوبة كالتالي:

VehicleID Name Locations
1 تشوك نيويورك، سياتل، فانكوفر
2 لاري لوس أنجلوس، هيوستن

بينما يمكنك تحقيق ذلك من خلال استعلامات معقدة وتكويد، نحتاج إلى حل يبسط هذه العملية.

الحل: استخدام وظائف 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 الخاص بك ومتطلباتك المحددة.

إذا كانت لديك أي أسئلة أو تحتاج إلى مزيد من التوضيح حول هذه الطرق، فلا تتردد في طرحها في التعليقات أدناه!