Frage

Ich habe eine Tabelle namens "Person". Es enthält die ID einer Person und die übergeordnete ID (nur ein Elternteil ist möglich). Als Ergebnis einer Abfrage möchte ich eine Tabelle mit der ersten Spalte - eine Person -ID und eine zweite Spalte - eine Liste der Kinder -IDs. Wie genau geht das? Ich habe über die Listagg -Funktion gelesen, bin mir aber nicht sicher, ob es für meinen Zweck geeignet ist. Und diese Abfrage erzeugt eine leere zweite Spalte:

Wählen Sie t1.id, (wählen Sie T2.ID aus Person T2, wobei t2.Parent_id = t1.id) aus Person t1 wobei t1.status = 'Eltern';

War es hilfreich?

Lösung

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

oder

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

Andere Tipps

Marks Implementierung von Listagg ist definitiv der richtige Weg für Oracle 11gr2. Für 11gr1 oder Oracle 10 können Sie stattdessen genau auf die gleiche Weise WMSYS.WM_CONCAT verwenden (kann eine Berechtigungszuschuss von Ihrem DBA erfordern).

Nur eine andere Möglichkeit, sich daran zu nähern ...

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
;

Wählen Sie wmsys.wm_concat () aus;

Es ist umstritten, aber es funktioniert - https://forums.oracle.com/forums/thread.jspa?threadid=2205545

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top