Oracle では、多くの場合、複数の行を 1 つの行に効率的に連結することが望ましい操作となります。この質問では、テーブルに次の形式のデータが含まれる特定のシナリオについて詳しく説明します:
question_id | element_id |
---|---|
1 | 7 |
1 | 8 |
2 | 9 |
3 | 10 |
3 | 11 |
3 | 12 |
目的は、このデータを次の望ましい結果に変換することです:
question_id | element_id |
---|---|
1 | 7,8 |
2 | 9 |
3 | 10,11,12 |
目的このタスクをストアド プロシージャに頼らずに効果的に実行できるように、Oracle 11gR2 では LISTAGG 句が導入されました。この注目すべき句により、このような連結操作を 1 つの SQL ステートメント内で直接実行できるようになります。
これを Oracle クエリに実装する方法は次のとおりです。
SELECT question_id, LISTAGG(element_id, ',') WITHIN GROUP (ORDER BY element_id) FROM YOUR_TABLE GROUP BY question_id;
LISTAGG 句は次の形式になります。 :
LISTAGG(expression, delimiter) WITHIN GROUP (ORDER BY expression)
この場合、「element_id」列を式として指定し、「,」を式として指定します。連結された値を区切る区切り文字。 WITHIN GROUP 句により、「question_id」列で定義された各グループ内で連結が確実に実行されます。
結果の連結文字列が VARCHAR2 データ型の最大長制限を超える可能性があることに注意してください ( 4000文字)。この潜在的な問題に対処するために、Oracle 12cR2 では ON OVERFLOW TRUNCATE/ERROR オプションが導入されました。このオプションを組み込むことで、長さ制限を超えた場合に文字列を切り詰めるか、エラーを発生させるかを指定できます。
以上がOracle SQLで複数の行を単一の行に効率的に連結するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。