Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Abap 选择单个还是选择最多1行在HANA中选择正确性?_Abap_Hana_Opensql - Fatal编程技术网

Abap 选择单个还是选择最多1行在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

我们正在迁移到HANA,一家外部公司正在进行代码修复。其中一些是自动化的。我看到了代码更改的地方:

*{   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