Это альтернативное решение, но оно может быть полезно для вас или кого-то еще.
Вам необходимо PIVOT
динамических данных, но в настоящее время Oracle не может сделать это в одном запросе SQL, только для статическихключи.Итак, давайте назначим статические ключи для ваших динамических ключей.
with
-- your key/value data table
tmp_data(fk_id, key_name, key_value) as
(
select 1, 'a', '000' from dual union
select 1, 'b', '111' from dual union
select 2, 'a', '222' from dual union
select 2, 'c', '333' from dual union
select 3, 'a', '444' from dual union
select 4, 'c', '555' from dual union
select 4, 'd', '666' from dual
),
-- a map of static keys for your dynamic keys
tmp_static(fk_id, key_name, key_num) as
(
select
0, -- just to union the data later
key_name, -- your dynamic key
row_number() over(order by key_name) -- our static key
from tmp_data
group by key_name
)
-- here we get a header row
select *
from tmp_static
pivot
(
max(key_name)
for(key_num) in (1,2,3,4,5,6,7,8,9,10,11,12) -- static keys expected at most
)
union
-- here we get data rows
select *
from
(
select
t1.fk_id,
t1.key_value,
t2.key_num
from tmp_data t1
inner join tmp_static t2 on 1=1
and t2.key_name = t1.key_name
)
pivot
(
max(key_value)
for(key_num) in (1,2,3,4,5,6,7,8,9,10,11,12) -- static keys expected at most
)
;
Результат будет следующим:
Как вы можете видетьв результате и в SQL первая строка фактически содержит имя ваших динамических ключей, потому что мы не могли отобразить их в PIVOT
до этого.Другие строки - ваши данные.
Есть много дополнительных столбцов без значения.Это потому, что мы сопоставили ваши динамические ключи с последовательными числами, начиная с 1, с количеством различных ключей в вашей таблице.Но мы не знаем этого числа перед тем, как писать в запросе, поэтому лучше всего было бы принять предельное число, которое никогда не будет достигнуто.
Как вы можете видеть из моего запроса, я предположил, что максимальное количество ключей для одного и того же fk_id равно 12, но вы всегда можете быть уверены в том, сколько столбцов имеют данные, выглядящие в строке заголовка, сколько столбцов имеетимена.Ваши приложения должны правильно обрабатывать эту строку заголовка и эти пустые столбцы.
Надеюсь, это поможет.