[BUG]当没有重复的列时,CREATE VIEW语句失败,并显示"重复的列名称"

2020-09-04 05:07发布

点击此处---> 群内免费提供SAP练习系统(在群公告中)加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)在SAP HANA中,当视图定义...

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

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


在SAP HANA中,当视图定义时,即使没有重复,CREATE VIEW语句似乎也会失败,并出现"重复的列名"错误。

  • 将两个表或视图连接在一起
  • 使用星号通配符选择其列
  • 在结果中添加一个额外的命名列

这是我能够创建的最小的例子,它再现了问题:

将视图v1创建为
     从哑元中选择0作为x1;
    
 创建视图v2为
     从哑元中选择0作为x2;

 创建视图v1and2为
     选择v1。*,v2。*,0作为x3
     从v1开始
     在v1.x1 = v2.x2上加入v2 

通过HANA Studio执行此代码后,最后 CREATE VIEW语句出现此错误:

 SAP DBTech JDBC:[272]:重复的列名称:X2
 

但是列名X2显然没有重复。

上面的最小示例是荒谬的(仅出于示例目的),但是我在我的移动仓库管理解决方案COBI.wms的HANA内部部署版本的生产代码中遇到了这个问题。 它严重依赖于视图来获取所需的确切数据。 从其他COBI.wms视图连接数据时,它使用星号通配符,因此不需要一遍又一遍列出所有列名。 该错误使这种做法无法实现。

HANA版本:

1.00.122.22.1543461992(fa/hana1sp12)

付费偷看设置
发送
4条回答
风早神人
1楼-- · 2020-09-04 05:41
我同意这不应该成为问题...但是只要指定列名,您就可以了。 最好使用列名,以便避免在添加列时避免出现问题(特别是在较大的项目中,这是有风险的)

 创建视图v1为
     从哑元中选择0作为x1; 创建视图v2为
     从哑元中选择0作为x2; 创建视图v1and2为
     选择v1.x1,v2.x2、0作为x3
     从v1开始
     在v1.x1 = v2.x2上加入v2; 
My梦
2楼-- · 2020-09-04 05:34

不幸的是,在我的情况下,这使代码的易管理性降低了,而不再易于管理。 如果有人好奇的话,这是我的情况的较长解释:

我定义的每个"核心视图"都返回有关特定类型对象(例如,文档,文档行,项目,度量单位,仓位等)的数据,并且这些结果在其结果列前加上一个单词以标识 对象的类型。 (用于项目的itemCode,itemName,itemGroupCode等;用于文档的docEntry,docNum,docDueDate等。)这样,避免了列名冲突,并且更复杂的视图可以通过 星号通配符,没有问题。

客户端代码仅需要知道视图将哪些类型的对象捆绑在一起,并调用相应的函数来提取每个对象。 例如。 如果我从将文档行和项目捆绑在一起的视图中进行选择,则我将调用makeDocumentLine(sqlResult)和makeItem(sqlResult)。 当我更改核心视图的列时,例如 返回项目数据的那个,我对处理该对象类型的客户端函数进行了相应的更改,例如 " makeItem"功能。

这样,将核心视图结合在一起的复杂视图仅充当"中间人",而无需了解它们所结合的核心视图的列。 (封装/抽象原理。)如果我必须手动列出所有联接的列,则更改为核心视图意味着必须遍历联接该视图的所有SQL视图,并在此进行相同的更改。 (突破了抽象和DRY原理,使代码非常重复且更易于出错。)

简而言之,我确实需要该星号通配符才能工作。 :-)

槿木_熙
3楼-- · 2020-09-04 05:52

我不确定我是否了解您的完整情况。

您如何尝试这样的事情?

将视图v1and2创建为
     选择*,0作为x3
     从v1开始
     在v1.x1 = v2.x2上加入v2
 
黑丝骑士
4楼-- · 2020-09-04 05:26

如果其他任何人遇到这样的问题:

到目前为止,我只是通过始终不将SELECT列表中的星号通配符与非通配符元素混合来解决该问题。

对于我要添加到SELECT列表中的任何非通配符列,我只是使用所需的列创建一个附加视图,然后使用通配符将其加入结果。

考虑以下示例,该示例触发了我描述的错误:

创建视图myOrders为
     选择" DocEntry"," DocNum"," CardCode"
     来自" ORDR"

 创建视图myOrderLines为
     选择" DocEntry"," LineNum"," ItemCode"
     来自" RDR1"

 创建视图myOrdersWithLines为
     按原样选择o。*,l。*," N"
     来自myOrders o
     在l。" DocEntry" = o。" DocEntry"上加入myOrderLines 

以下产生相同结果的替代方法将在不触发错误的情况下起作用:

创建视图myOrders为
     选择" DocEntry"," DocNum"," CardCode"
     来自" ORDR"

 创建视图myOrderLines为
     选择" DocEntry"," LineNum"," ItemCode"
     来自" RDR1"

 创建视图notSelected为
     按原样选择" N"

 创建视图myOrdersWithLines为
     选择o。*,l。*,n。*
     来自myOrders o
     在l。" DocEntry" = o。" DocEntry"上加入myOrderLines l
     加入notSelected n on 1 = 1 

确切的解决方案将取决于您的视图,但是基本思想是将选择/计算值的视图与仅使用星号通配符将其他视图连接在一起的视图严格分开。 只要您不混淆它们,该错误就不会触发。

一周热门 更多>