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

Oracle ORA-32031:在WITH子句中非法引用查询名称,oracle,oracle10g,Oracle,Oracle10g,我正在尝试使用Oracle 10g创建CTE,不幸的是出现以下错误 ORA-32031:在WITH子句中非法引用查询名称 有没有办法解决或替代解决方案使其发挥作用?不幸的是,我不得不使用旧版本 与异常抗争,经过几个小时的尝试和研究,这似乎是一个版本控制问题,这意味着我正在使用的版本不支持CTE。我不确定,但当我在SQLServer2008中尝试该查询时,它运行得很好。这是迄今为止尝试过的查询: with Q1 as ( select m.id, m.value, row_number()

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

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

有没有办法解决或替代解决方案使其发挥作用?不幸的是,我不得不使用旧版本

与异常抗争,经过几个小时的尝试和研究,这似乎是一个版本控制问题,这意味着我正在使用的版本不支持CTE。我不确定,但当我在SQLServer2008中尝试该查询时,它运行得很好。这是迄今为止尝试过的查询:

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;
表:

样本输入:


对于在SQL Server中工作的参考,这里是工作解决方案-

您需要更新版本的Oracle数据库

当您仍然停留在10g上时,沿着以下线路连接应该可以工作:

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。。。超过

您需要更新版本的Oracle数据库

当您仍然停留在10g上时,沿着以下线路连接应该可以工作:

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。。。超过

Oracle 10根本不支持递归公共表表达式。Q2 CTE正在引用自身。你打算运行递归CTE吗?是的@Tim Biegeleisen。这是一个递归的CTE。好吧,看起来是这样。但是有什么办法可以完成吗?我几乎要放弃这个版本@a_horse_,名称为_no_。递归CTE的另一个替代方案是connect byOracle 10,它根本不支持递归公共表表达式。Q2 CTE正在引用它自己。你打算运行递归CTE吗?是的@Tim Biegeleisen。这是一个递归的CTE。好吧,看起来是这样。但是有什么办法可以完成吗?我几乎要放弃这个版本了@a_horse_,没有名字。递归CTE的另一个选择是connect By,虽然我没有完全理清逻辑,但你几乎做到了@Chris Saxon。这是我期望的链接和输出-你想做什么?链接中的输出与问题中递归查询的预期或实际输出不匹配。请查看-?检查id是否出现8或8之和一次。因此对于1122,前四个2返回8@Chris Saxon并更新符合条件的行。基本上,我在第一次出现id时检查8或8的总和,并尝试将其转换为Oracle 10g。您好@Chris Saxon!你看到链接了吗?你现在意识到了目的了吗?虽然我没有完全弄清楚逻辑,但你几乎做到了@Chris Saxon。这是我期望的链接和输出-你想做什么?链接中的输出与问题中递归查询的预期或实际输出不匹配。请查看-?检查id是否出现8或8之和一次。因此对于1122,前四个2返回8@Chris Saxon并更新符合条件的行。基本上,我在第一次出现id时检查8或8的总和,并尝试将其转换为Oracle 10g。您好@Chris Saxon!你看到链接了吗?你现在知道链接的目的了吗?
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
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