SELECT 的三个部分
在 OPEN SQL 中,SELECT
语句可以查询数据字典中定义过的数据库或者视图中的数据。
常见语法:
SELECT result FROM source INTO target [WHERE condition] [GROUP BY fields] [HAVING cond] [ORDER BY fileds].
由上可知,SELECT
语句主体至少由三个必须的部分构成:
SELECT result
部分FROM source
部分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 后面可以紧跟两个关键字 SINGLE
和 DISTINCT
,我们来看一下这两者的区别:
SELECT SINGLE
代码如下:
SELECT SINGLE mandt carrid connid fldate FROM sflight INTO gs_out.
使用如上代码,可以获取一条记录。需要注意的是:
- 使用这条语句最好跟上
WHERE
条件,通常使用这种方式来获取描述表某个信息的描述。 - 当使用
SELECT SINGLE
时,将不能使用ORDER BY
和APPENDING
语句。
SELECT DISTINCT
代码如下:
SELECT DISTINCT mandt carrid connid FROM sflight INTO TABLE gt_out.
结果如下:
当我们想排除重复的行时,可以使用 SELECT DISTINCT
。正如上面结果中所看到的,Airline 和 Flight No. 在任何行中都是不一样的。