代码之家  ›  专栏  ›  技术社区  ›  gkubed Sergei Grigoriev

选择单个与最多选择1行在HANA中选择正确性?

  •  0
  • gkubed Sergei Grigoriev  · 技术社区  · 6 年前

    我们正在迁移到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.
    

    我想 SELECT SINGLE 总是比 SELECT...UP TO 1 ROWS...ENDSELECT. 还有那个 ORDER BY 只获取一条记录时不执行任何操作。似乎他们正在取代 选择单个 在我们的代码中。我同事的原始代码中有什么不符合HANA?

    2 回复  |  直到 6 年前
        1
  •  1
  •   VXLozano    6 年前

    Urban Legend(和我的经验,但我无法证明)说,公共DBMS使用主键提供行,因为这是它们保存数据的方式。HANA按列而不是按行排序,因此当您只要求一行时,它会返回给您第一行“she”可以根据您的条件进行构建。

    因为你做不到 SELECT SINGLE...ORDER BY ,您必须找到另一种方法:

    • 建议:满足 WHERE 子句有足够的条件来获取您真正需要的行
    • 让HANA通过询问“仅一行,按主键查找”来模拟旧的DBMS行为。

    如果你总是提供 在哪里? 子句有足够的条件,您可以继续使用单一语法,但我担心有些公司会要求您不要这样做,因为它们面临着依赖于旧DMBS行为的懒惰的编码人员的结果:(

        2
  •  1
  •   gkubed Sergei Grigoriev    6 年前

    有时是必要的,但大多数不是

    大多数情况下,这是不必要的,就像在您的示例中一样。

    SELECT SINGLE S可分为3组:

    • 完全主键搜索
    • 存在性检查
    • 其他

    完全主键搜索

    matnr spras 是表的主键字段 makt ,因此同一行已经返回,独立于任何排序。
    我想第三方工具不够复杂,无法检查所选表的关键字段。

    存在性检查

    很多select-single被用来检查数据库中是否存在值。

    SELECT SINGLE posnr
        FROM VBPA 
        WHERE vbeln = iv_vbeln
    

    我们不关心返回哪个项目编号,只要它大于0。这里的转换也是不必要的,顺序无关紧要。

    什么时候有用?

    只有在第三种情况下,当我们没有完整的主键时,我们仍然关心订购。这是相当罕见的。

    检查主键是很困难的,而且完全不可能找出原始程序员是否需要从代码中获得特定的顺序。

    这个工具将提供比有用的发现更多的误报。