写点什么

工作笔记之 SELECT 语句在 SAP ABAP 中的用法总结(上)

作者:宇宙之一粟
  • 2022 年 9 月 23 日
    中国香港
  • 本文字数:2628 字

    阅读完需:约 9 分钟

工作笔记之 SELECT 语句在 SAP ABAP 中的用法总结(上)

日常开发过程中,最常用的语句可能就是查询语句了。那么如果从数据库表中查询数据呢?


答: select from 语句。

SELECT 的三个部分

在 OPEN SQL 中,SELECT 语句可以查询数据字典中定义过的数据库或者视图中的数据。


常见语法:


SELECT result  FROM source  INTO target  [WHERE condition]  [GROUP BY fields]  [HAVING cond]  [ORDER BY fileds].
复制代码


由上可知,SELECT 语句主体至少由三个必须的部分构成:


  1. SELECT result 部分

  2. FROM source 部分

  3. INTO target 部分


SELECT result 说明


第一部分是结果集。SELECT 一般是查询多条数据到内表中,result 也就是结果集,用于查询指定的字段,说明我们想从选定的表中得到说明数据。


  • 可以查询一条,也可以查询多条。如果指定只查询一条数据,则要用结构体承载数据,而不是内表,后面要跟 ENDSELECT ,但因为性能问题,SAP 也不推荐这种方式;


  • 如果查询单条数据到结构体后面不跟 ENDSELECT,使用语法检查也会得到如下提示:


Incorrect nesting: Before the end of the program, the control structure introduced by "SELECT" must be closed by "ENDSELECT".
复制代码


  • 既可以直接输入字段列表,也可以使用 * 来获取表中所有的字段。同理,由于性能问题,不建议使用 * 号。通常业务中不会需要一个表中的所有字段;

  • 查询单条记录时用 SINGLE 来指定,用 DISTINCT 语句可以在查询时删除重复值。


FROM source 说明


第二部分是 FROM 语句,用来定义我们要从哪个表或者视图 source 中获取数据。


  • FROM 可以放到 INTO 表达式之前,也可以放在之后;

  • 如果是从多个表或视图中查询,可以用 JOIN 语句连接表,ON 来指定连接条件,通过 AS 来指定表的别名;

  • 还可以通过 UP TO n ROWS 来指定最多的查询记录,防止因一次查询的数据过多而导致出现性能问题;


INTO target 说明


第三部分是 INTO 语句,INTO 后面的 target 用于指定查询出来的数据存储在何处,若有多条数据则存储在内表中,若是单条数据则存放在结构体中。


接着,我们来看一个组合这三个部分的简单例子:


*&---------------------------------------------------------------------**& Report zlerning_select*&---------------------------------------------------------------------**&*&---------------------------------------------------------------------*REPORT zlerning_select.
DATA: BEGIN OF gs_out, mandt TYPE sy-mandt, carrid TYPE sflight-carrid, " 航线代码 connid TYPE sflight-connid, " 航班连接编号 fldate TYPE sflight-fldate, " 航班日期 END OF gs_out.DATA: gt_out LIKE TABLE OF gs_out.
DATA: gr_alv TYPE REF TO cl_salv_table, gr_columns TYPE REF TO cl_salv_columns_table.


SELECT mandt carrid connid fldate FROM sflight INTO TABLE gt_out.

CALL METHOD cl_salv_table=>factory IMPORTING r_salv_table = gr_alv CHANGING t_table = gt_out.
gr_columns = gr_alv->get_columns( ).gr_columns->set_optimize( value = 'X' ).gr_alv->display( ).
复制代码

运行结果截图如下:

SINGLE 和 DISTINCT 区别


SELECT 后面可以紧跟两个关键字 SINGLEDISTINCT ,我们来看一下这两者的区别:


SELECT SINGLE 代码如下:

 SELECT SINGLE mandt carrid connid fldate FROM sflight INTO gs_out.
复制代码

使用如上代码,可以获取一条记录。需要注意的是:

  • 使用这条语句最好跟上 WHERE 条件,通常使用这种方式来获取描述表某个信息的描述

  • 当使用 SELECT SINGLE 时,将不能使用 ORDER BYAPPENDING 语句。


SELECT DISTINCT 代码如下:

 SELECT DISTINCT mandt carrid connid FROM sflight INTO TABLE gt_out.
复制代码

结果如下:



当我们想排除重复的行时,可以使用 SELECT DISTINCT 。正如上面结果中所看到的,Airline 和 Flight No. 在任何行中都是不一样的。


INTO 语句大有可能

INTO target 后面跟的语句也有几种可能:

  • INTO: target 为结构体,即选择字段值到对应结构体,参考 SELECT SINGLE 示例

  • INTO CORRESPONDING FIELD OF: 系统会帮助我们选择和匹配对应的数据元素到相应的字段,要求自定义的字段名和系统的数据元素名称一样

  • INTO [ obj1, obj2 ...]: 我们可以选择一个与给定变量有关的字段。例如,如果我们想选择 carridconnid 字段,我们可以选择这些字段直接给相关的变量,而不是一个结构体或内表

  • INTO TABLE: 这个功能与 INTO 相似,但是我们跟的是一个表而不是一个结构体,因此可以获取多条数据

  • INTO CORRESPONDING FIELDS OF TABLE: 这本条功能与 INTO CORRESPONDING FIELD OF 类似,区别也是在于可以获得不止一条数据,后面跟的是能够存储多条结果的内表

  • APPPENDING:当我们想追加新的记录,而不是用新的选择来替换它们时,可以使用 APPENDING ,使用 INTO 的结果就是替换

我们用代码来看一下 INTOINTO CORRESPONDING FIELDS OF


 SELECT carrid connid  FROM sflight INTO TABLE gt_out.
复制代码

这条语句会将 mandt 字段跳过,然后将 carridconnid 替换成前两条的结果,导致想要的数据和字段并不匹配,客户端代码变成了 AA 数据,如图:



这个原因是 SELECT 只会尝试按照顺序将数据装入给定的字段。


为了解决这个问题,就需要用到 CORRESPONDING FILEDS OF,如下:

 SELECT carrid connid  FROM sflight INTO CORRESPONDING FIELDS OF TABLE gt_out.
复制代码

此时,查询的结果就会匹配了,没有查询的字段的值则为空,如下图:



PS:然后,与 INTO 相比, corresponding fields 有一个问题:在执行 SELECT 和向对应字段添加数据时,字段的比较会花费更多的时间,尤其是在海量数据时比较明显。

APPENDING 语句

APPENDING 语句支持在不删除之前选择的行的情况下增加新的行。

 SELECT carrid connid  FROM sflight INTO CORRESPONDING FIELDS OF TABLE gt_out. SELECT mandt carrid connid fldate price FROM sflight APPENDING CORRESPONDING FIELDS OF TABLE gt_out.
复制代码

INTO 部分我们只选择了查询 connidcarrid 字段,但是在接下来的 SELECT 中,我们使用 APPENDING 语句追加了同样的行,而且增加了 mandtfldateprice 字段。



总结

本文总结了 SAP ABAP 开发中最常用的查询语句: SELECT 语句,并从主体的三个部分进行语法拆解,SELECT result FROM source INTO target ,并分别介绍了它们的功能和可能会使用的语句。今后也会将这段时间以来的笔记总结并分享,希望对今后从事 SAP 开发的人有所帮助!


发布于: 2022 年 09 月 23 日阅读数: 20
用户头像

宇宙古今无有穷期,一生不过须臾,当思奋争 2020.05.07 加入

🏆InfoQ写作平台-第二季签约作者 🏆 混迹于江湖,江湖却没有我的影子 热爱技术,专注于后端全栈,轻易不换岗 拒绝内卷,工作于软件工程师,弹性不加班 热衷分享,执着于阅读写作,佛系不水文

评论 (1 条评论)

发布
用户头像
催更催更!
2022 年 09 月 23 日 19:32 · 广东
回复
没有更多了
工作笔记之 SELECT 语句在 SAP ABAP 中的用法总结(上)_数据库_宇宙之一粟_InfoQ写作社区