Question

J'ai une table nommée « personne ». Il contient l'identifiant de la personne et son ID parent (un seul parent est possible). En conséquence d'une requête, je veux une table avec la première colonne - un identifiant de personne, et une deuxième colonne - une liste des enfants de it id de. Comment exactement à faire cela? Je l'ai lu sur la fonction listagg, mais je ne suis pas sûr si elle convient à mon but. Et cette requête produit une seconde colonne vide:

select t1.id, (Sélectionnez t2.id de t2 personne où t2.parent_id = t1.id) de personne t1 où t1.status = 'parent';

Était-ce utile?

La solution

SELECT parent_id,
       RTRIM(XMLAGG(XMLELEMENT(e,child_id || ',')).EXTRACT('//text()'),',') AS "Children"
  FROM parentChildTable
 WHERE parent_id = 0
 GROUP BY parent_id

ou

SELECT parent_id,
       LISTAGG(child_id, ',') WITHIN GROUP (ORDER BY child_id) AS "Children"
  FROM parentChildTable
 WHERE parent_id = 0
 GROUP BY parent_id

Autres conseils

La mise en œuvre de Mark of LISTAGG est certainement la voie à suivre pour 11gR2 Oracle. Pour Pour 11gR1 ou Oracle 10, vous pouvez utiliser à la place wmsys.wm_Concat exactement de la même façon (peut nécessiter une Octroyer des autorisations de votre DBA)

Juste une autre façon de l'aborder ...

SELECT parent_id,max(child_list) FROM (
  SELECT parent_id,sys_connect_by_path(child_number,',') child_list FROM (
    SELECT parent_id, id,
           row_number() over (partition by parent_id order by id) child_number
      FROM person
      WHERE parent_id IS NOT NULL
  )
  START WITH child_number=1
  CONNECT BY parent_id = PRIOR parent_id AND child_number = PRIOR child_number + 1
)
GROUP BY parent_id
ORDER BY parent_id
;

SELECT wmsys.wm_concat () À partir de;

Il est controversé, mais il fonctionne - https://forums.oracle.com /forums/thread.jspa?threadID=2205545

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top