كيف يمكن ربط صفوف متعددة في صف واحد في Oracle دون إنشاء إجراء مخزن؟[ينسخ]
-
21-08-2019 - |
سؤال
هذا السؤال لديه بالفعل إجابة هنا:
كيف يمكنني تحقيق ما يلي في أوراكل دون إنشاء إجراء مخزن؟
مجموعة البيانات:
question_id element_id
1 7
1 8
2 9
3 10
3 11
3 12
نتيجة مرغوبة:
question_id element_id
1 7,8
2 9
3 10,11,12
المحلول
هناك العديد من الطرق للقيام بتجميع السلسلة، ولكن أسهلها هي وظيفة يحددها المستخدم. جرب هذا بطريقة لا تتطلب وظيفة. كملاحظة، لا توجد طريقة بسيطة بدون الوظيفة.
هذا هو أقصر طريق بدون وظيفة مخصصة:(يستخدم الدالتين ROW_NUMBER() وSYS_CONNECT_BY_PATH)
SELECT questionid,
LTRIM(MAX(SYS_CONNECT_BY_PATH(elementid,','))
KEEP (DENSE_RANK LAST ORDER BY curr),',') AS elements
FROM (SELECT questionid,
elementid,
ROW_NUMBER() OVER (PARTITION BY questionid ORDER BY elementid) AS curr,
ROW_NUMBER() OVER (PARTITION BY questionid ORDER BY elementid) -1 AS prev
FROM emp)
GROUP BY questionid
CONNECT BY prev = PRIOR curr AND questionid = PRIOR questionid
START WITH curr = 1;
نصائح أخرى
من Oracle 11gR2، ليستاج يجب أن تؤدي الجملة الحيلة:
SELECT question_id,
LISTAGG(element_id, ',') WITHIN GROUP (ORDER BY element_id)
FROM YOUR_TABLE
GROUP BY question_id;
احذر إذا كانت السلسلة الناتجة كبيرة جدًا (أكثر من 4000 حرف لـ VARCHAR2، على سبيل المثال):من الإصدار 12cR2، يمكننا استخدام عند تجاوز السعة/الخطأ للتعامل مع هذه القضية.
سهل:
SELECT question_id, wm_concat(element_id) as elements
FROM questions
GROUP BY question_id;
تم اختباره شخصيًا على 10 جرام ;-)
من http://www.Oracle-base.com/articles/10g/StringAggregationTechniques.php
يحتوي خيط OTN هذا على عدة طرق للقيام بتجميع السلسلة، بما في ذلك مقارنة الأداء: http://forums.Oracle.com/forums/message.jspa?messageID=1819487#1819487