كيف يمكن ربط صفوف متعددة في صف واحد في Oracle دون إنشاء إجراء مخزن؟[ينسخ]

StackOverflow https://stackoverflow.com/questions/1076011

سؤال

هذا السؤال لديه بالفعل إجابة هنا:

كيف يمكنني تحقيق ما يلي في أوراكل دون إنشاء إجراء مخزن؟

مجموعة البيانات:

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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top