【发布时间】:2011-04-12 14:19:32
【问题描述】:
我以前从未见过这个...我有一个这样开始的查询:
with q1 as
(select a.V_ID, a.D_ID, a.C_ID,
case when a.percent > 0 THEN 'Y' ELSE 'N' end L_val,
a.C_val
from ab_a_table a
where a.C_ID = '00000003' -- '00000007' -- test values
and a.B_VAL = '6010001'
and a.Q = '11234567')
select case
when ... /* rest of query omitted */
当我尝试运行它时,Oracle 抱怨说 table or view does not exist。但是 它在第 3 行突出显示了 ',',而不是实际的表/视图名称:
我省略的查询的其余部分相当长且复杂——如有必要,我将对其进行清理并发布——现在我只想说这个错误仅在我添加引用q1 的第三个子查询时才开始。事实上,似乎我可以删除 3 个子查询中的任何一个,整个事情都会执行(尽管结果不正确),所以感觉就像我遇到了某种 Oracle 错误而不是纯 SQL 错误。有趣的是,我可以将q1 的主体作为独立查询运行,并且这样做没有问题。只有当我运行整个查询时,它才会抱怨q1 中的逗号后面的逗号。
有没有人经历过这种情况?
(使用 Oracle 10g)。
编辑:尝试添加 AS 关键字。现在的结果是:
看起来星号在相同的位置,但在 V 下方,因为单词 L_VAL 已移动了 3 个字符。很奇怪……
【问题讨论】:
-
这有点远,但尝试将有问题的行更改为“case when a.percent > 0 THEN 'Y' ELSE 'N' end AS L_VAL” - 换句话说,添加“AS”关键字。
-
显然错误超出了公用表表达式,因此您应该发布完整的语句。我强烈认为突出显示只是指向错误的位置 - 无论是什么工具进行突出显示,因为“Oracle”不会进行错误突出显示
-
@FrustratedWithFormsDesigner:你的补丁级别是多少?在 10.2.0.4 补丁集中有一个与 ORA-00942 和 WITH 子句相关的错误修复:5130732。它有点模糊,但看起来优化器搞砸了,所以我相信添加或删除子查询可能会有所作为。 (错误报告中的示例也指向第 3 行)。
-
@FrustratedWithFormsDesigner:Metalink 注释和错误不建议任何解决方法。您可以尝试提示,但不知道有什么帮助 - 吮吸它的情况,我害怕。 (PUSH_SUBQ、UNNEST 或 NO_UNNEST 可能......)。否则,您将不得不重新设计查询以避免连接。唯一发生的另一件事是使函数返回一个引用游标,并用其中的游标替换子查询。不管你做什么都有潜在的性能影响。
-
如果问题是 WITH 子句错误 Alan Poole 描述了尝试将 WITH 子句更改为内联视图。或者创建一个实际的视图。
标签: sql oracle oracle10g ora-00942