この同じ質問について複数の質問がありますが、私の問題を解決するものは見つかりませんでした。私もこのことについてはarticleを知っている、それは私が以下のコードのために使ったものです。私はほんの少し問題を抱えている...複数の行を1つの列に結合する関連するテーブルが3つあるOracleの関数
table_a:
a_id a_name
1 aaa
2 bbb
3 ccc
table_b:
b_id b_name
1 ddd
2 eee
3 fff
table_c
a_id b_id
1 2
1 3
2 1
3 1
3 2
3 3
私は上記の表があると私はこれを達成するSELECTステートメントを必要とする:
a_name list_of_b_name
aaa eee,fff
bbb ddd
ccc ddd,eee,fff
はたぶんWM_CONCAT(試していない)のような私は、プロセスを簡素化するために使用できるいくつかのOracleの機能は、ありますが、私のようにする必要がありFUNCTIONを使用し、これは上記のリンク先の記事を見た後に私の試みです:
CREATE OR REPLACE
FUNCTION f_test(id IN table_c.a_id % TYPE) RETURN VARCHAR2 IS
l_text VARCHAR2(32767) := NULL;
BEGIN
FOR cur_rec IN (SELECT b_id FROM table_c WHERE a_id = id) LOOP
l_text := l_text || ',' || cur_rec.b_id;
END LOOP;
RETURN LTRIM(l_text, ',');
END;
そしてSELECTはこのように書きます:コードAによって期待されるよう
SELECT a_id, f_test(a_id)
FROM table_c
GROUP BY a_id;
BOVE(ないない私が欲しいもの、これは私が得るものです):
a_id list_of_b_id
1 2,3
2 1
3 1,2,3
私はSELECTおよび機能コードの両方で多くのことを試みたが、私は私が必要なものをやるように見えることはできません...
GROUP BY関数を使用する必要はなく、関数外でJOINを行う必要はありません。 –
@OMGPonies - TABLE_Aを実行するために関数とクエリを実装しているため、ソリューションには当てはまります。 OPは何か違ったものを投稿し、それを実装しました。 TABLE_CにないレコードがTABLE_Cにない場合、解決策は私のものとは異なる結果セットを返します(TABLE_Cに参加するためのクエリを修正しない限り、私はそれが優秀ではないと思います - 同じテーブルで2つ選択する)。今では、TABLE_Aのすべての行についてTABLE_Cに行が常に存在するかもしれませんが、OPはそのビジネスルールを私たちに保証していません。 – APC
残念ながら、細かいことを少しでも覚えているのは難しいです...そして、はい、TABLE_CのTABLE_Aからのエントリが常に存在します。ごめんなさい。 –