2009-07-02 6 views

risposta

25

Ci sono molti modi per fare l'aggregazione stringa, ma il più semplice è una funzione definita dall'utente. Try this for a way that does not require a function. Come nota, non esiste un modo semplice senza la funzione.

Questo è il percorso più breve, senza una funzione personalizzata: (usa il ROW_NUMBER() e le funzioni 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

funziona benissimo! ROW_NUMBER() è quello che mi mancava per far funzionare sys_connect_by_path per me. –

+1

Si noti che quando questa tecnica viene applicata per concatenare un campo il cui valore può contenere il separatore, viene generato il seguente errore: 'ORA-30004: quando si utilizza la funzione SYS_CONNECT_BY_PATH, non può avere separatore come parte del valore della colonna. ... E se il valore concatenato supera la lunghezza massima di 4000 byte, si otterrebbe l'errore: 'ORA-01489: il risultato della concatenazione di stringhe è troppo lungo. – Somu

32

Facile:

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

pesonally testato su 10g ;-)

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

+3

Nota che wm_concat è una funzione non documentata. Quindi potresti voler pensarci due volte prima di usare questo nel codice di produzione. –

+0

Molto interessante. Funziona anche per me, ma dovrò assicurarmi che questa funzione sia disponibile nel nostro ambiente di produzione. –

+2

Ottengo Errore -> ORA-00904 WM_CONCAT: Identificatore non valido –

69

da Oracle 11gR2, la clausola LISTAGG dovrebbe fare il trucco:

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

Come nota a margine, possiamo conoscere la versione del database interrogando la tabella 'v $ version' o' product_component_version'. 11.2 indica 11gR2. – Somu

+0

in ogni caso mi ha aiutato – Almas

+0

Usarlo per molto tempo e questo è semplice come si ottiene. – elrado

Problemi correlati