2009-07-02 11 views

Respuesta

25

Hay muchas maneras de hacer la agregación de cuerdas, pero la más fácil es una función definida por el usuario. Try this for a way that does not require a function. Como nota, no hay una manera simple sin la función.

Ésta es la ruta más corta y sin una función personalizada: (se utiliza el ROW_NUMBER() y funciones 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; 
+0

funciona muy bien! ROW_NUMBER() es lo que me faltaba para que sys_connect_by_path me funcionara. –

+1

Tenga en cuenta que cuando se aplica esta técnica para concatenar un campo cuyo valor puede contener el separador, se produce el siguiente error: 'ORA-30004: cuando se utiliza la función SYS_CONNECT_BY_PATH, no puede tener separador como parte del valor de la columna' ... Y si el valor concatenado excede la longitud máxima de 4000 bytes, obtendría el error: 'ORA-01489: el resultado de la concatenación de cadenas es demasiado largo. – Somu

32

Fácil:

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

pesonally probado en 10 g ;-)

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

+3

Tenga en cuenta que wm_concat es una función no documentada. Así que es posible que desee pensar dos veces antes de usar esto en el código de producción. –

+0

Muy bueno. También funciona para mí, pero necesitaré asegurarme de que esta función esté disponible en nuestro entorno de producción. –

+2

Aparece el error -> ORA-00904 WM_CONCAT: Identificador inválido –

69

desde Oracle 11gR2, la cláusula LISTAGG debe hacer el truco:

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

Como nota al margen, podemos conocer la versión de la base de datos al consultar la tabla 'v $ version' o' product_component_version'. 11.2 indica 11gR2. – Somu

+0

en cualquier caso me ayudó – Almas

+0

Utilizándolo durante mucho tiempo y esto es tan simple como se pone. – elrado

Cuestiones relacionadas