Pregunta

Tengo una mesa llamada "persona". Contiene la identificación de la persona y su identificación de los padres (solo un padre es posible). Como resultado de una consulta, quiero una tabla con la primera columna, una identificación de persona y una segunda columna, una lista de sus ID de sus niños. ¿Cómo hacer esto exactamente? He leído sobre la función Listagg, pero no estoy seguro de si es apropiado para mi propósito. Y esta consulta produce una segunda columna vacía:

Seleccione T1.id, (seleccione T2.ID de la persona T2 donde t2.parent_id = t1.id) de la persona t1 donde t1.status = 'parent';

¿Fue útil?

Solución

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

o

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

Otros consejos

La implementación de Mark de Listagg es definitivamente el camino a seguir para Oracle 11Gr2. Para 11Gr1 o Oracle 10, puede usar wmsys.wm_concat en su lugar exactamente de la misma manera (puede requerir una subvención de permisos de su DBA)

Solo otra forma de abordarlo ...

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
;

Seleccione wmsys.wm_concat () desde;

Es controvertido, pero funciona https://forums.oracle.com/forums/thread.jspa?threadid=2205545

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top