4

「人」という名前のテーブルがあります。個人の ID と親の ID が含まれます (親は 1 つだけ可能です)。クエリの結果として、最初の列 (個人 ID) と 2 番目の列 (子供の ID のリスト) を持つテーブルが必要です。これをどのように正確に行うのですか?listagg 関数について読んだことがありますが、それが私の目的に適しているかどうかはわかりません。そして、このクエリは空の 2 番目の列を生成します。

t1.id を選択します (t2.parent_id = t1.id である人物 t2 から t2.id を選択します)。t1.status = 'parent' である人物 t1 から;

4

4 に答える 4

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

また

SELECT parent_id,
       LISTAGG(child_id, ',') WITHIN GROUP (ORDER BY child_id) AS "Children"
  FROM parentChildTable
 WHERE parent_id = 0
 GROUP BY parent_id
于 2011-03-16T12:43:46.053 に答える
1

Mark の LISTAGG の実装は、間違いなく Oracle 11GR2 に適しています。For 11GR1 または Oracle 10 の場合、まったく同じ方法で代わりに wmsys.wm_Concat を使用できます (DBA からの権限付与が必要になる場合があります)。

于 2011-03-16T14:02:31.650 に答える
0

それにアプローチする別の方法...

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
;
于 2011-03-16T13:43:32.353 に答える