ホームページ >データベース >mysql チュートリアル >Oracle でストアド プロシージャを使用せずに複数の行を 1 つの行に連結するにはどうすればよいですか?
ストアド プロシージャを使用せずに Oracle で複数の行を 1 つの行に連結する
Oracle でデータを操作する場合、複数の行を 1 つの行に結合する必要があります。従来、これはストアド プロシージャを使用して実現できました。ただし、Oracle の LISTAGG 句を使用した、より効率的で簡単な解決策があります。
Oracle の LISTAGG 句
Oracle 11gR2 で導入された LISTAGG 句を使用すると、次のことが可能になります。複数の値を単一の文字列にまとめます。次の構文を使用します:
LISTAGG(expression, delimiter) WITHIN GROUP (ORDER BY column)
例
次のデータセットを考えてみましょう:
question_id | element_id |
---|---|
1 | 7 |
1 | 8 |
2 | 9 |
3 | 10 |
3 | 11 |
3 | 12 |
連結するには各 question_id の element_id 値を 1 つの行にまとめると、次のクエリを使用できます。
SELECT question_id, LISTAGG(element_id, ',') WITHIN GROUP (ORDER BY element_id) FROM your_table GROUP BY question_id;
Output
question_id | element_id |
---|---|
1 | 7,8 |
2 | 9 |
3 | 10,11,12 |
大きな結果に関する考慮事項Strings
結果の文字列が 4000 を超えると予想される場合文字 (VARCHAR2 データ型の最大長) を使用するには、Oracle 12cR2 で導入された次の拡張機能を使用できます。
SELECT question_id, LISTAGG(element_id, ',') WITHIN GROUP (ORDER BY element_id) ON OVERFLOW TRUNCATE/ERROR FROM your_table GROUP BY question_id;
以上がOracle でストアド プロシージャを使用せずに複数の行を 1 つの行に連結するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。