Il y a plusieurs façons de faire l'agrégation de chaîne, mais le plus simple est une fonction définie par l'utilisateur. Try this for a way that does not require a function. Comme une note, il n'y a pas de moyen simple sans la fonction.
Ceci est le plus court chemin sans une fonction personnalisée: (il utilise le ROW_NUMBER() et les fonctions de 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;
fonctionne très bien! ROW_NUMBER() est ce qui me manquait pour que sys_connect_by_path fonctionne pour moi. –
Notez que lorsque cette technique est appliquée pour concaténer un champ dont la valeur peut contenir le séparateur, l'erreur suivante est levée: 'ORA-30004: en utilisant la fonction SYS_CONNECT_BY_PATH, ne peut pas avoir de séparateur comme partie de la valeur de la colonne. la valeur concaténée arrive à dépasser la longueur maximale de 4000 octets, vous obtiendrez l'erreur: 'ORA-01489: le résultat de la concaténation de chaîne est trop long .' – Somu