OracleのSelect Statementの結果としてのコンマ区切りリスト[複製
-
25-10-2019 - |
質問
この質問にはすでに答えがあります:
「人」という名前のテーブルがあります。個人のIDとその親IDが含まれています(1人の親のみが可能です)。クエリの結果として、最初の列(人ID、2番目の列)のテーブルが子供IDのリストが必要です。これをどのように正確に行うのですか? ListAgg機能について読んだことがありますが、それが私の目的に適しているかどうかはわかりません。そして、このクエリは空の2番目の列を生成します:
t1.idを選択します(t2.idからt2.idを選択します。ここでt2.parent_id = t1.id)from t1 where t1.status = 'parent';
解決
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
他のヒント
MarkのListaggの実装は、間違いなくOracle 11gr2に行く方法です。 11gr1またはOracle 10の場合、代わりにwmsys.wm_concatを使用することができます(DBAからのアクセス許可補助金が必要になる場合があります)
それにアプローチする別の方法...
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
;
wmsys.wm_concat()fromを選択します。
それは物議をかもしますが、それは機能します - https://forums.oracle.com/forums/thread.jspa?threadid=2205545
所属していません StackOverflow