Domanda

Ho una tabella denominata "persona". Esso contiene id della persona e del genitore id (un solo genitore è possibile). Come risultato di una query, voglio un tavolo con prima colonna - una persona id, e una seconda colonna - un elenco di esso è figli di id. Esattamente come per fare questo? Ho letto sulla funzione listagg, ma non sono sicuro se è appropriato per il mio scopo. E questa ricerca produce una seconda colonna vuota:

selezionare t1.id, (Selezionare t2.id da persona t2 dove t2.parent_id = t1.id) da persona t1 dove t1.status = 'genitore';

È stato utile?

Soluzione

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

Altri suggerimenti

implementazione di Mark di LISTAGG è sicuramente la strada da percorrere per Oracle 11gR2. Per Per 11gR1 o Oracle 10 è possibile utilizzare wmsys.wm_Concat invece esattamente nello stesso modo (può richiedere a concedere le autorizzazioni dal DBA)

Just another way to approach it ...

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() FROM ;

It's controversial, but it works - https://forums.oracle.com/forums/thread.jspa?threadID=2205545

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top