Wie können mehrere Zeilen in einer in Oracle verkettet werden, ohne dass eine gespeicherte Prozedur erstellen? [Duplikat]

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

Frage

    

Diese Frage bereits eine Antwort hier:

         

Wie kann ich die folgenden in Oracle erreichen, ohne eine gespeicherte Prozedur erstellen?

Datensatz:

question_id    element_id
1              7
1              8
2              9
3              10
3              11
3              12

Gewünschtes Ergebnis:

question_id    element_id
1              7,8
2              9
3              10,11,12
War es hilfreich?

Lösung

Es gibt viele Wege, die Zeichenfolge Aggregation zu tun, aber die einfachste ist eine benutzerdefinierte Funktion. Versuchen Sie dies für eine Art und Weise, die keine Funktion nicht erforderlich. Als Hinweis , gibt es keine einfache Möglichkeit, ohne die Funktion.

Dies ist der kürzeste Weg, ohne eine benutzerdefinierte Funktion: (es die ROW_NUMBER () verwendet, und SYS_CONNECT_BY_PATH Funktionen)

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;

Andere Tipps

Von Oracle 11gR2, die LISTAGG Klausel sollte es tun:

SELECT question_id,
       LISTAGG(element_id, ',') WITHIN GROUP (ORDER BY element_id)
FROM YOUR_TABLE
GROUP BY question_id;

Vorsicht, wenn der resultierende String zu groß ist (mehr als 4000 Zeichen für eine VARCHAR2, zum Beispiel): ab Version 12cR2 können wir ON OVERFLOW TRUNCATE / ERROR mit diesem Thema befassen.

Ganz einfach:

SELECT question_id, wm_concat(element_id) as elements
FROM   questions
GROUP BY question_id;

Pesonally getestet auf 10 g; -)

http://www.oracle-base.com/articles/10g /StringAggregationTechniques.php

Der OTN-Thread enthält mehr Möglichkeiten, String-Aggregation, darunter einen Performance-Vergleich zu tun: http://forums.oracle.com/forums/message.jspa?messageID=1819487#1819487

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top