何かが欠けていない限り、あなたはデータをピボットしようとしています。これを行うにはいくつかの方法があります。
集計関数とCASE
式を使用できます。
select x.id,
max(case when y.identifier = 1 then y.value end) Value1,
max(case when y.identifier = 2 then y.value end) Value2
from tablex x
left join tabley y
on x.id = y.id
group by x.id
デモで SQL Fiddle を参照してください
Oracle のバージョンに応じて、次のPIVOT
関数を使用できます。
select id,
Value1,
Value2
from
(
select x.id, y.identifier, y.value
from tablex x
left join tabley y
on x.id = y.id
)
pivot
(
max(value)
for identifier in ('1' as Value1, '2' as Value2)
) piv
デモで SQL Fiddle を参照してください
複数回参加できます:
select x.id,
y1.value Value1,
y2.value Value2
from tablex x
left join tabley y1
on x.id = y1.id
and y1.identifier = 1
left join tabley y2
on x.id = y2.id
and y2.identifier = 2
SQL Fiddle with Demoを参照してください。
動的なソリューションを探している場合は、sys_refcursor を使用してプロシージャを作成できます。
CREATE OR REPLACE procedure dynamic_pivot(p_cursor in out sys_refcursor)
as
sql_query varchar2(8000) := 'select x.id ';
begin
for x in (select distinct identifier from tabley order by 1)
loop
sql_query := sql_query ||
' , max(case when y.identifier = '||x.identifier||' then y.value else null end) as Value'||x.identifier;
dbms_output.put_line(sql_query);
end loop;
sql_query := sql_query || ' from tablex x
left join tabley y
on x.id = y.id
group by x.id';
dbms_output.put_line(sql_query);
open p_cursor for sql_query;
end;
/
これらのソリューションでは、値ごとに別々の列に結果が表示されます。単一の列にデータが必要な場合は、次を使用できますLISTAGG()
。
select x.id,
listagg(y.value, ' ') within group (order by y.id) as Value
from tablex x
left join tabley y
on x.id = y.id
group by x.id
デモで SQL Fiddle を参照してください