1

Oracle に table1 と table2 の 2 つのテーブルがあります (非常に想像力に欠ける DBA がいます!)

table1 には列 ID (およびその他のいくつか) があります。

table2 には列 id、table1id、および code があります。table1id は table1 への外部キーです。

通常、各 table1 行に対して 1 つの table2 行がありますが、table1 行に対して 2 つの table2 行が存在する場合もあれば、3 つの行が非常にまれに存在する場合もあります。

必要なのは、table1 行ごとに 1 つの「コード」値です。対応する table2 行が複数ある場合は、返されるすべての値を連結した文字列が必要なので、結果は次のようになります。

table1.id     code
1             a
2             b
3             a b
4             a b c

これをどのように達成できるか考えていますか?それが SQL Server の場合、関数を作成しますが、これは私が望むよりも遅くなります。ただし、私は SQL Server ほど Oracle に熱中していません。

4

2 に答える 2

3

Oracleのバージョンを指定していませんが。Oracle 11gを使用している場合は、次のLISTAGG()関数を使用できます。

select t1.id,
    listagg(t2.code, ' ') within group(order by t1.id) code
from table1 t1
left join table2 t2
    on t1.id = t2.id
group by t1.id

Oracle 10gを使用している場合は、次を使用できますWM_CONCAT

select t1.id,
    WM_CONCAT(t2.code) code
from table1 t1
left join table2 t2
    on t1.id = t2.id
group by t1.id
于 2012-10-17T11:10:46.073 に答える
1

@bluefeetには正しい解決策がありますが、10gを使用していて、何らかの理由でWM_CONCATを使用したくない場合(たとえば、文書化されていません)、別の解決策があります:

select t1.id, 
   RTRIM(XMLAGG(XMLELEMENT(e,code,',').EXTRACT('//text()')),',') code 
from table1 t1
left join table2 t2 
   on t1.id = t2.id
group by t1.id
于 2012-10-17T11:55:08.923 に答える