HANA SQL:"无法支持递归公用表表达式"

2020-09-13 14:22发布

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


大家好,

我在HANA 1 SPS 12上,并且创建了此数据库表:

创建表"测试"(ID int不为空); 

当我尝试执行此查询时:

使用" test" AS(SELECT * FROM" RBOUMAN"。" test")
 SELECT * FROM" test"; 

我收到此错误消息:

 SAP DBTech JDBC:[7]:不支持的功能:不支持递归公用表表达式'test':第1行第6行(在pos 5)
 无法执行"
 

我不明白为什么会发生这种情况。

WITH子句中的子查询引用了" RBOUMAN"。" test",在我看来,它明确指向架构" RBOUMAN"中的数据库表" test" "。
该错误似乎表明HANA认为该子查询正在引用自身。

不使用加引号的标识符的类似查询也可以正常工作:

,DUMMY为(
 选择*,'Y'作为Y
 来自SYS.DUMMY
 )
 从DUMMY中选择Y; 
有人可以向我解释为什么第一个查询给我这个结果吗? 是虫子吗?

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


大家好,

我在HANA 1 SPS 12上,并且创建了此数据库表:

创建表"测试"(ID int不为空); 

当我尝试执行此查询时:

使用" test" AS(SELECT * FROM" RBOUMAN"。" test")
 SELECT * FROM" test"; 

我收到此错误消息:

 SAP DBTech JDBC:[7]:不支持的功能:不支持递归公用表表达式'test':第1行第6行(在pos 5)
 无法执行"
 

我不明白为什么会发生这种情况。

WITH子句中的子查询引用了" RBOUMAN"。" test",在我看来,它明确指向架构" RBOUMAN"中的数据库表" test" "。
该错误似乎表明HANA认为该子查询正在引用自身。

不使用加引号的标识符的类似查询也可以正常工作:

,DUMMY为(
 选择*,'Y'作为Y
 来自SYS.DUMMY
 )
 从DUMMY中选择Y; 
有人可以向我解释为什么第一个查询给我这个结果吗? 是虫子吗?
付费偷看设置
发送
4条回答
1楼-- · 2020-09-13 15:12

我认为您正在与用户RBOUMAN在设置了默认架构RBOUMAN的SQL控制台中执行该语句。 在这种情况下,在语句SELECT * FROM" test"中,如果您用" test"表示CTE结果或表" RBOUMAN"。" test"(因为考虑了默认架构RBOUMAN),它不是唯一的。

如果您使用命令SET SCHEMA设置了控制台中的其他架构-其中不存在"测试"表-它将适用于您的方案(例如SET SCHEMA SYSTEM)。 但这当然不是解决方案,因为您应该选择一个不与表名称冲突的特定CTE结果名称。

如果是bug,我不知道,因为对于HANA来说,正式解释文档的顺序不是正式的。 但是根据我的感觉,我会拒绝。 也许SAP的某人可以放弃一些与此有关的知识。

致谢,
弗洛里安语

吹牛啤
2楼-- · 2020-09-13 15:02

您好弗洛里安·菲弗,感谢您的答复!

首先:您的假设是正确的,我以RBOUMAN的身份执行-我应该提到这一点。 而且,的确如此-当我将架构设置为不包含此类表的其他架构时,不会发生错误-所以:谢谢! :)

(我同时验证了带引号的标识符和裸露的标识符;我最初认为那里有一个区别,但事实并非如此)

但是,我仍然 没有看到设置架构应该如何有所作为。

我们可以验证此问题确实仅与子查询有关,如果运行以下命令,则与最终的实际SELECT语句无关:

创建表测试(ID int不为null); 
以测试方式进行(
SELECT * FROM RBOUMAN.TEST

SELECT * FROM DUMMY;

此查询仍会导致"功能不受支持:无法支持递归公用表表达式'TEST'"错误。

因此,在此最后一个查询中,出现了两次标识符TEST:查询名称( 在AS之前),以及子查询中的表名。 子查询名称不在特定架构内,它们只是整个查询范围内的名称。 如果范围内恰好有一个表与查询具有相同的名称,则该行为应该是查询名称优先,因为它是最接近的。 以下示例说明了确实如此:

创建表T1(ID int不为空); 
插入表T1值(1);

创建表T2(ID int不为空);
插入T2值(2) ;

-返回2,因为T1引用了称为T1
WITH T1 AS( 选择*从T2 )
SELECT * FROM T1;

-由于RBOUMAN.T1将T1限定为架构中的表,因此返回1 使用T1 AS( 选择*从T2 ) 选择* FROM RBOUMAN.T1;

现在回到此示例:

测试为(
SELECT * FROM RBOUMAN.TEST

SELECT * FROM DUMMY;

子查询中的FROM限定表名。 因此,它只能表示模式RBOUMAN中的表T1。
子查询外部的查询名TEST可能与现有表名相同,在这种情况下,它可能掩盖了对TEST的不合格引用(如我们所见) 在上一个示例中)。 但是我没有看到任何合理的方法来允许将合格的引用RBOUMAN.TEST误插入作为对本地名称为TEST的子查询的引用,因为WITH子句中的子查询根本不驻留在架构中并且不能被限定 。

(在接受您的回答之前,我会稍等一下,看看是否有人从SAP发出声音,但是再次感谢您的答复!我真的很感激:)

me_for_i
3楼-- · 2020-09-13 15:03

据我所知,这是对表表达式中使用的任何表/视图名称进行直接测试以使其与查询中的任何表表达式名称都不匹配的结果。 如果存在匹配项,则假定他应该是递归访问。

为什么这样实现,这可能是实际开发人员的问题。

对于命名优先顺序,我的理解是,对于当前模式中所有对象的引用(即" "中的" "部分。" "与current_schema匹配) 显式架构命名被忽略,这使对表表达式的引用与本地架构相等。

从用户的角度来看,此设置从未遇到问题,因为我通常尝试使用"说"名称作为表和表达式别名。

微wx笑
4楼-- · 2020-09-13 15:07

高兴,欢呼,足够公平:)

一周热门 更多>

点击此处---> EasySAP.com 一起学习S4 HANA ...

相关问答