ORA-32031:在WITH子句中非法引用查询名称

问题描述 投票:0回答:1

我正在尝试使用Oracle 10g创建CTE,但不幸出现以下错误

ORA-32031:在WITH子句中非法引用查询名称

是否有解决方法或替代解决方案以使其正常工作? (不幸的是我必须使用旧版本)

[在例外情况下苦苦挣扎,经过数小时的尝试和研究,这似乎是一个版本问题,这意味着我正在使用的版本不支持CTE。我不确定,但是当我在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 Server中工作的参考,这是工作解决方案-Working Sample

oracle oracle10g
1个回答
2
投票

您需要更新的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 ( ... )

执行此操作
© www.soinside.com 2019 - 2024. All rights reserved.