Abap 选择单个还是选择最多1行在HANA中选择正确性?
我们正在迁移到HANA,一家外部公司正在进行代码修复。其中一些是自动化的。我看到了代码更改的地方:Abap 选择单个还是选择最多1行在HANA中选择正确性?,abap,hana,opensql,Abap,Hana,Opensql,我们正在迁移到HANA,一家外部公司正在进行代码修复。其中一些是自动化的。我看到了代码更改的地方: *{ REPLACE DEVK9A1ZZH * SELECT SINGLE maktx * INTO tab-maktx * FROM makt * WHERE matnr EQ strmatnr * AND spras EQ sy-langu. SE
*{ REPLACE DEVK9A1ZZH
* SELECT SINGLE maktx
* INTO tab-maktx
* FROM makt
* WHERE matnr EQ strmatnr
* AND spras EQ sy-langu.
SELECT maktx
UP TO 1 ROWS
INTO tab-maktx
FROM makt
WHERE matnr = strmatnr
AND spras = sy-langu ORDER BY maktx.
ENDSELECT.
我认为selectsingle
总是比SELECT…最多1行…ENDSELECT.
更可取,而且orderby
在只获得一条记录时没有任何作用。似乎他们正在替换我们代码中的每一个SELECT SINGLE
。我的同事的原始代码中有什么不符合HANA Urban legend(以及我的经验,但我无法证明这一点)说,通用DBMS使用主键提供行,只是因为这是它们保存数据的方式。HANA按列而不是按行排序,因此当您只要求一行时,它会返回给您第一行“她”可以根据您的条件进行构建
由于您无法按选择单个…订单,因此必须找到另一种方法:
- 建议:使用足够的条件满足
子句,以获得真正需要的行WHERE
- 要求HANA通过询问“仅一行,按主键搜索”来模拟旧的DBMS行为
WHERE
子句,您可以继续使用单一语法,但我担心一些公司会要求您不要这样做,因为他们面临着懒惰的程序员依赖旧的DMBS行为的结果:(城市传奇(以及我的经验,但我无法证明这一点)假设公共DBMS使用主键提供行,因为这是它们存储数据的方式。HANA按列而不是按行排序,因此当您只要求一行时,它会返回给您第一行“她”可以根据您的条件进行构建
由于您无法按选择单个…订单,因此必须找到另一种方法:
- 建议:使用足够的条件满足
子句,以获得真正需要的行WHERE
- 要求HANA通过询问“仅一行,按主键搜索”来模拟旧的DBMS行为
WHERE
子句,您可以继续使用单一语法,但我担心一些公司会要求您不要这样做,因为他们面临的结果是懒惰的程序员依赖于旧的DMBS行为:(有时这是必要的,大多数情况下不是
大多数情况下,这是不必要的,就像在您的示例中一样
SELECT SINGLE
s可分为3组:
- 完整主键搜索
- 生存检查
- 其他
matnr
和spras
是表makt
的主键字段,因此已返回同一行,与任何排序无关。我猜第三方工具不够复杂,无法检查所选表的关键字段 生存检查 相当多的selectsingle仅用于检查数据库中是否存在一个值
SELECT SINGLE posnr
FROM VBPA
WHERE vbeln = iv_vbeln
我们不关心返回哪个项目编号,只要它大于0。这里的转换也是不必要的,订购不重要
什么时候有用?
只有在第三种情况下,当我们没有完整的主键时,我们仍然关心排序。这是非常罕见的
检查主键是很困难的,而且根本不可能找出原始程序员是否需要代码的特定顺序
这个工具会给你更多的误报,而不是有用的发现。有时它是必要的,大多数情况下不是
大多数情况下,这是不必要的,就像在您的示例中一样
SELECT SINGLE
s可分为3组:
- 完整主键搜索
- 生存检查
- 其他
matnr
和spras
是表makt
的主键字段,因此已返回同一行,与任何排序无关。我猜第三方工具不够复杂,无法检查所选表的关键字段 生存检查 相当多的selectsingle仅用于检查数据库中是否存在一个值
SELECT SINGLE posnr
FROM VBPA
WHERE vbeln = iv_vbeln
我们不关心返回哪个项目编号,只要它大于0。这里的转换也是不必要的,订购不重要
什么时候有用?
只有在第三种情况下,当我们没有完整的主键时,我们仍然关心排序。这是非常罕见的
检查主键是很困难的,而且根本不可能找出原始程序员是否需要代码的特定顺序
这个工具会给你更多的误报,而不是有用的发现。无论哪种方式,你的代码都很好(但在第一个未经中介的版本中编码的效率要高得多),因为你发出的是MAKTX的主键(MATNR+SPRAS),因此只能返回一条记录,并且顺序无关
HANA自动修正通常似乎会进行很多不必要的“修正”,但这一修正尤其令人恼火。您的代码无论哪种方式都很好(但在第一个未经调解的版本中编码效率更高),因为您正在发出MAKTX的主键(MATNR+SPRAS),因此只能返回一条记录,且顺序无关
HANA自动修复通常似乎会进行许多不必要的“修复”,但这一修复尤其令人恼火。不确定
单个与多达关键字之间的区别,但按顺序
显示“如果此WHERE子句返回了多条记录,则按此字段排序并获取前1条记录“我认为这对于SINGLE
或UP
查询非常重要,除非您非常肯定在UP
/SINGLE
应用于记录集之前只返回一条记录。否则,您只需选择u