ORA-32031: недопустимая ссылка на имя запроса в предложении WITH - PullRequest
0 голосов
/ 01 апреля 2020

Я пытаюсь создать CTE с Oracle 10g и, к сожалению, получаю следующую ошибку

ORA-32031: недопустимая ссылка на имя запроса в предложении WITH

Есть ли способ решить или альтернативное решение, чтобы оно работало? (К сожалению, я должен использовать старую версию)

Борьба с исключением, и после нескольких часов попыток исследования, похоже, проблема управления версиями, которая означает, что CTE не поддерживается в версии I Я работаю с. Я не уверен, но когда я попробовал запрос в SQL Server 2008, он работал просто отлично. Это проверенный запрос:

with Q1 as
(
    select m.id, m.value, row_number() over (partition by id order by storedate) as n
    from sample_test_2020 m
),
Q2 as
(
    select Q1.id, value as s, n as m, lpad(n, 3, '0') as p 
    from Q1
    where value <= 8 
    union all
    select Q1.id, Q1.value + s as s, Q1.n as m, Q2.p || ',' || lpad(Q1.n, 3, '0') as p
    from Q1
    inner join Q2 on Q2.id = Q1.id and Q1.n > Q2.m and Q1.value + s <= 8
),
Q3 as
(
    select id, min(p) as p
    from Q2 
    where s = 8
    group by id
)

select * from Q3;

Ожидаемый результат :

ID   P
1122 001,004
4466 001,004

Таблица :

CREATE TABLE SAMPLE_TEST_2020 
(
  ID VARCHAR2(20 BYTE) 
, STOREDATE DATE 
, VALUE NUMBER 
, INFO VARCHAR2(20 BYTE) 
) 

Пример ввода :

ID      STOREDATE   VALUE INFO
4466    01-JAN-20   2     DONE
4466    02-JAN-20   2     DONE
4466    03-JAN-20   2     DONE
4466    04-JAN-20   6     DONE
1122    01-JAN-20   2     DONE
1122    02-JAN-20   2     DONE
1122    03-JAN-20   2     DONE
1122    04-JAN-20   6     DONE

Для справки, которая работала на SQL сервере, вот рабочее решение - Рабочий пример

1 Ответ

2 голосов
/ 01 апреля 2020

Вам нужна более свежая версия Oracle База данных!

Пока вы все еще застряли на 10g, connect by по этим направлениям должно работать:

with rws as (
  select m.id, m.value, 
         row_number() over (
           partition by id order by storedate
         ) as rn
  from sample_test_2020 m
), tree as (
  select id, lpad ( rn, 3, '0' ) rn, prior value + value v
  from   rws
  start with value <= 8
  connect by prior rn < rn
  and prior id = id
  and prior value + value <= 8
)
  select id, min ( rn ) || ',' || max ( rn ) p
  from   tree
  group  by id;

ID      P         
1122    001,004    
4466    001,004  

Хотя честно говоря, я не совсем понимаю цель вашего запроса. Похоже, он вычисляет какой-то промежуточный итог - это можно сделать, используя sum ... over ( ... )

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...