Ask Tom article I linked to предполагает, что это проблема со значениями данных, а также количеством столбцов, и это похоже на пример, показанный там; но в этом случае это, по-видимому, просто количество столбцов.
Это настоящий хак, но, похоже, он работает. Здесь t42
эффективно представляет результат соединения между вашими реальными таблицами. Если я создаю что манекен таблицы и добавить несколько строк с минимальными данными:
create table t42 (inst_id number, id_data number, value_text varchar2(4000));
insert into t42 values (1, 1, 'w');
insert into t42 values (1, 2, 'x');
insert into t42 values (1, 3, 'y');
insert into t42 values (1, 4, 'z');
Тогда это все еще не:
select max(case when id_data = 1 then value_text end),
max(case when id_data = 2 then value_text end),
max(case when id_data = 3 then value_text end),
max(case when id_data = 4 then value_text end),
max(case when id_data = 5 then value_text end),
max(case when id_data = 6 then value_text end),
max(case when id_data = 7 then value_text end),
max(case when id_data = 8 then value_text end),
max(case when id_data = 9 then value_text end),
max(case when id_data = 10 then value_text end),
max(case when id_data = 11 then value_text end),
max(case when id_data = 12 then value_text end),
max(case when id_data = 13 then value_text end),
max(case when id_data = 14 then value_text end),
max(case when id_data = 15 then value_text end),
max(case when id_data = 16 then value_text end)
from t42
group by inst_id;
from t42
*
ERROR at line 17:
ORA-01467: sort key too long
мне нужно только 16 агрегатные выражения, которые я думаю, все еще связано с моим блоком размер которого составляет 2k в единственной базе данных 9i, которую я все еще имею. Если вам нужно 32 столбца, чтобы получить ошибку, я бы предположил, что размер вашего блока равен 4k. Не уверен, что это действительно важно, если вы не можете его увеличить.
После небольшого количества экспериментов это первая альтернатива, которую я нашел, чтобы работать:
with t as (
select inst_id, id_data,
case when id_data = 1 then value_text end as x1,
case when id_data = 2 then value_text end as x2,
case when id_data = 3 then value_text end as x3,
case when id_data = 4 then value_text end as x4,
case when id_data = 5 then value_text end as x5,
case when id_data = 6 then value_text end as x6,
case when id_data = 7 then value_text end as x7,
case when id_data = 8 then value_text end as x8,
case when id_data = 9 then value_text end as x9,
case when id_data = 10 then value_text end as x10,
case when id_data = 11 then value_text end as x11,
case when id_data = 12 then value_text end as x12,
case when id_data = 13 then value_text end as x13,
case when id_data = 14 then value_text end as x14,
case when id_data = 15 then value_text end as x15,
case when id_data = 16 then value_text end as x16
from t42
)
select (select max(x1) from t t2 where t2.inst_id = t.inst_id),
(select max(x2) from t t2 where t2.inst_id = t.inst_id),
(select max(x3) from t t2 where t2.inst_id = t.inst_id),
(select max(x4) from t t2 where t2.inst_id = t.inst_id),
(select max(x5) from t t2 where t2.inst_id = t.inst_id),
(select max(x6) from t t2 where t2.inst_id = t.inst_id),
(select max(x7) from t t2 where t2.inst_id = t.inst_id),
(select max(x8) from t t2 where t2.inst_id = t.inst_id),
(select max(x9) from t t2 where t2.inst_id = t.inst_id),
(select max(x10) from t t2 where t2.inst_id = t.inst_id),
(select max(x11) from t t2 where t2.inst_id = t.inst_id),
(select max(x12) from t t2 where t2.inst_id = t.inst_id),
(select max(x13) from t t2 where t2.inst_id = t.inst_id),
(select max(x14) from t t2 where t2.inst_id = t.inst_id),
(select max(x15) from t t2 where t2.inst_id = t.inst_id),
(select max(x16) from t t2 where t2.inst_id = t.inst_id)
from t
group by inst_id;
(SEL (SEL (SEL (SEL (SEL (SEL (SEL (SEL (SEL (SEL (SEL (SEL (SEL (SEL (SEL (SEL
---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ----
w x y z
Всех Самосоединении болезненны, но, по крайней мере, они находятся на наборе результатов от вашего основного запроса , так что вы по-прежнему только поражаете свои реальные таблицы - остальное просто нуждается в достаточной памяти для управления всеми данными, которые возвращаются.
Поскольку нет агрегации в настоящее время не происходит в основном запросе, только в подзапросов, это, возможно, понятнее использовать distinct
, а не group by
, хотя эффект один и тот же:
...
select distinct inst_id,
(select max(x1) from t t2 where t2.inst_id = t.inst_id),
...
(select max(x16) from t t2 where t2.inst_id = t.inst_id)
from t;
Это просто демонстрация , Где я использовал t42
в качестве держателя места с поддельными данными, верните исходный запрос и добавьте столько агрегатов, сколько вам нужно; поэтому в with
пункте:
with t as (
select inst_id, id_data,
case when id_data = 34756 then value_text end as x1,
...
case when id_data = 34999 then value_text end as x32
from (
select procreldata.id_inst,
dataset.value_text,
procreldata.id_data
from wfdata procreldata
inner join wfvalue dataset
on dataset.id_data= procreldata.id_data
where procreldata.id_inst=177262
)
)
select distinct inst_id,
(select max(x1) from t t2 where t2.inst_id = t.inst_id),
...
(select max(x32) from t t2 where t2.inst_id = t.inst_id)
from t;
Я не говорю, что это красиво, конечно ...
[Это ценности, связанные, а не только количество агрегатов] (http://asktom.oracle .com/Pls/asktom/F P = 100: 11: 0 :::: P11_QUESTION_ID: 508222056084). –
ok Что мне нужно сделать для выполнения этого запроса? –