我正在尝试使用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数据库版本!
虽然您仍然停留在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 ( ... )