Oracle では、"order by" 句を指定した listagg 関数を使用して、複数の行を 1 つの行に変換できます。このステートメントは、データを並べ替えて、並べ替えられた結果を結合することができます。構文は "listagg (列名) ,'区切り文字') グループ内 (列名順)」。
このチュートリアルの動作環境: Windows 10 システム、Oracle 11g バージョン、Dell G3 コンピューター。
必要に応じて、取得した組織配下の下位組織を1行のデータにまとめる必要があり、Oracle独自の機能です。 used
listagg (列名、'区切り文字') グループ内 (列名順)
つまり、各グループ内で、LISTAGG は次に従って列を並べ替えます。 order by 句と並べ替え 最終結果は結合されます
私の組織構造はツリー構造であり、次の SQL は現在の部門の下にあるすべてのサブ部門の名前をクエリします。
SELECT LISTAGG(O.ORGNAME,',') WITHIN GROUP(ORDER BY LEVEL) FROM ORGANIZATION O START WITH O.ORGID = 1000 CONNECT BY PRIOR O.ORGID = O.PID AND LEVEL<4
注: 上記の SQL では、ツリー構造内のデータがどのレベルにあるかを示す Oracle キーワード LEVEL が使用されています。
上記の SQL では、Oracle ツリー クエリ ステートメント START WITH … CONNECT も使用されています。 BY PRIOR …
クエリがノードのすべての親ノードに対するものである場合、上記の START WITH SQL をSTART WITH O.ORGID = 1000 CONNECT BY PRIOR O.PID = O に変更する必要があります。 ORGID
(PRIOR 以降のフィールドは前の順序と同じではありません)
ORGANIZATION テーブルのデータは次のとおりです
ORGID | ORGNAME | PID |
---|---|---|
小学校 | 0 | |
1 年生 | #1000 | |
2 年生 | 1000 | |
101 クラス | 1100 | ##1102 |
1100 | 1103 | |
1100 | 1201 | |
1200 |
1 年生 | |
##2 年生 | |
101 クラス | |
クラス 102 | |
クラス 103 | |
201Class | |
2.LISTAGG…グループ内… |
#3. 親ノードの下にあるすべての子ノードを 1 行にまとめます
SELECT LISTAGG(O.ORGNAME,',') WITHIN GROUP(ORDER BY LEVEL) FROM ORGANIZATION O START WITH O.ORGID = 1000 CONNECT BY PRIOR O.ORGID = O.PID AND LEVEL<4
実行結果は以下のとおりです。
小学校、1年、2年、101クラス、102クラス、103クラス、201クラス
Oracle Video Tutorial#」 ##"
以上がOracle で複数の行を 1 つの行に変換する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。