Ниже приведен вариант для Oracle 10g
и более поздних версий. Поскольку в исходном наборе данных имеется большое количество строк, я попытаюсь избежать решений, которые включают группировку и аналитические функции поверх полного набора результатов.
Базовая таблица для этого примера:
create table tab1 (
ID number,
col1 varchar2(4),
col2 varchar2(4),
col3 varchar2(4),
col4 varchar2(4)
)
Во-первых, собрать все столбцы для каждого ID
в отсортированном коллекции:
select
tab1.ID,
cast(multiset(
select
decode(level,
1, tab1.col1,
2, tab1.col2,
3, tab1.col3,
4, tab1.col4,
null
)
from dual
connect by level <= 4
order by
decode(level,
1, tab1.col1,
2, tab1.col2,
3, tab1.col3,
4, tab1.col4,
null
)
nulls last
) as sys.ODCIVarchar2List) sorted_values
from tab1;
Имея такой набор данных, что можно расшифровать значения обратно столбцов при сохранении установленный порядок:
select
ID,
(
select column_value
from table(data_list.sorted_values)
where rownum = 1
) as col1,
(
select max(decode(rownum, 2, column_value, null))
from table(data_list.sorted_values)
) as col2,
(
select max(decode(rownum, 3, column_value, null))
from table(data_list.sorted_values)
) as col3,
(
select max(decode(rownum, 4, column_value, null))
from table(data_list.sorted_values)
) as col4
from (
select
rownum, -- this needed as workaround for Oracle bug
tab1.ID,
cast(multiset(
select
decode(level,
1, tab1.col1,
2, tab1.col2,
3, tab1.col3,
4, tab1.col4,
null
)
from dual
connect by level <= 4
order by
decode(level,
1, tab1.col1,
2, tab1.col2,
3, tab1.col3,
4, tab1.col4,
null
)
nulls last
) as sys.ODCIVarchar2List) sorted_values
from tab1
)
data_list
SQLFiddle test
Обратите внимание, что rownum
должен присутствовать во внутреннем select
пункте как обходной путь для this Oracle error.
Что вы пробовали? Какие у вас ошибки? Покажите нам какой-то код. Также пометьте это в sql – hrv
Как мы узнаем, какие столбцы перетасовать? Должен ли быть запрос или может быть хранимой процедурой? –
Что находится в полях, у которых нет «переменной»: 'space' или' NULL'? –