2014-02-14 2 views
0


Я использую Oracle 9i SQL database.I хочет написать запрос, как этого
Сортировать ключ слишком долго ошибка в Oracle SQL 9i

select 
id_process_inst,<br> 
max(case when id_data=34756 then value_text end),<br> 
max(case when id_data=34760 then value_text end),<br> 
max(case when id_data=34793 then value_text end),<br> 
max(case when id_data=34792 then value_text end),<br> 
max(case when id_data=34790 then value_text end),<br> 
max(case when id_data=34761 then value_text end),<br> 
max(case when id_data=34791 then value_text end),<br> 
max(case when id_data=34766 then value_text end),<br> 
max(case when id_data=34778 then value_text end),<br> 
max(case when id_data=34767 then value_text end),<br> 
m....<br> 
from<br> 
(<br> 
select <br> 
procreldata.id_inst,<br> 
dataset.value_text,<br> 
procreldata.id_data<br> 
from wfdata procreldata<br> 
inner join wfvalue dataset<br> 
on dataset.id_data= procreldata.id_data<br> 
where procreldata.id_inst=177262<br> 
)<br> 
group by id_inst;<br> 

Всякий раз, когда я пытаюсь выполнить этот запрос, я получаю «Сгруппировать слишком длинная "ошибка. Я предполагаю, что это потому, что я использую около 32 максимальных функций в этом запросе.
Пожалуйста, помогите мне решить эту проблему.
Спасибо заранее.

+1

[Это ценности, связанные, а не только количество агрегатов] (http://asktom.oracle .com/Pls/asktom/F P = 100: 11: 0 :::: P11_QUESTION_ID: 508222056084). –

+0

ok Что мне нужно сделать для выполнения этого запроса? –

ответ

1

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; 

Я не говорю, что это красиво, конечно ...

+0

Спасибо за ваш ценный ответ. Я получаю сообщение об ошибке, когда число «максимальных» функций превышает 16, а не 32. И я должен достичь результата без создания каких-либо новых таблиц. Возможно ли это? Если да, пожалуйста, поделитесь со мной. –

+0

Нет, вам не нужна новая таблица, извините, что это было непонятно. Где я положил 'from t42', замените свой исходный запрос' from (select procreldata.id_inst, ... где procreldata.id_inst = 177262) '. У меня нет ваших исходных таблиц или данных, поэтому мой 't42' был просто быстрым способом подделать этот промежуточный результат. –

+0

Хорошо, я проверю и дам вам знать результат. Спасибо –