前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >「SAP ABAP」OPEN SQL(四)【FROM语句】

「SAP ABAP」OPEN SQL(四)【FROM语句】

作者头像
THUNDER王
发布2023-03-20 16:50:13
8210
发布2023-03-20 16:50:13
举报
文章被收录于专栏:THUNDER王——CSDN内容同步
在这里插入图片描述
在这里插入图片描述

💂作者简介: THUNDER王,一名热爱财税和SAP ABAP编程以及热爱分享的博主。目前于江西师范大学会计学专业大二本科在读,同时任汉硕云(广东)科技有限公司ABAP开发顾问。在学习工作中,我通常使用偏后端的开发语言ABAP,SQL进行任务的完成,对SAP企业管理系统,SAP ABAP开发和数据库具有较深入的研究。



前言

  各位小伙伴们大家好呀!今天继续SAP ABAP系列文章的讲解,本节带来的内容是OPEN SQL中FROM语句的介绍,希望大家喜欢!


数据库表准备

  本文所有案例都是基于数据库表SFLIGHT,本案例中的SFLIGHT数据库表数据如下,供各位小伙伴们对照来观察代码运行结果:

在这里插入图片描述
在这里插入图片描述

FROM语句介绍

  ABAP中的FROM语句是用于从数据库表中检索数据的语句。它通常与SELECT语句一起使用,用于指定要从哪个数据库表中检索数据。   以下是FROM语句的一般语法样式:

代码语言:javascript
复制
SELECT <fields>
FROM TABLE <database_table>
[WHERE <conditions>]
[GROUP BY <group_fields>]
[HAVING <having_conditions>]
[ORDER BY <order_fields>]
[CLIENT SPECIFIED|BYPASSING BUFFER|UP TO n ROWS].

参数介绍:

  • <fields>:需要返回的字段,可以是表字段、计算字段或表达式等。
  • <database_table>:表类型:静态表或动态表。(注:动态表名称或表表达式,可以是字符串或一个动态表变量。)
  • [WHERE <conditions>]:WHERE子句用于过滤出符合条件的行,可以包含多个条件,条件之间使用AND或OR连接。
  • [GROUP BY <group_fields>]:GROUP BY子句用于对查询结果按照指定的字段进行分组,通常用于配合聚合函数进行使用。
  • [HAVING <having_conditions>]:HAVING子句用于在分组后对分组结果进行过滤,可以使用聚合函数和条件进行筛选。
  • [ORDER BY <order_fields>]:ORDER BY子句用于对结果集按照指定的字段进行排序,可以指定多个排序字段,并可以指定升序或降序排列。
  • [CLIENT SPECIFIED|BYPASSING BUFFER|UP TO n ROWS]:可选项,用于指定查询的一些选项,例如是否使用客户端缓存、是否跳过缓存、是否限制查询结果集的行数等。

 案例演示

  下面给出一段以SFLIGHT数据库表为基准的示例代码,基本涵盖以上所有参数,仅供参考:

这一段的代码没有带上HAVING可选项,并且使用了OPEN SQL新语法,老语法十分繁琐并且对上述可选项支持不友好。

代码语言:javascript
复制
SELECT carrid,SUM( PRICE ) AS CNT
FROM sflight
INTO  TABLE @DATA(result_set)
GROUP BY carrid.

LOOP AT result_set INTO DATA(result_line).
  WRITE: / result_line-carrid, result_line-CNT.
ENDLOOP.
在这里插入图片描述
在这里插入图片描述

这一段的代码在上一段代码的基础上带上了HAVING可选项

代码语言:javascript
复制
SELECT carrid,SUM( PRICE ) AS CNT
FROM sflight
INTO  TABLE @DATA(result_set)
GROUP BY carrid
HAVING SUM( PRICE ) > 1000.

LOOP AT result_set INTO DATA(result_line).
  WRITE: / result_line-carrid, result_line-CNT.
ENDLOOP.
在这里插入图片描述
在这里插入图片描述

表类型选择

在这里插入图片描述
在这里插入图片描述

  FROM语句中获取数据来源的数据库表既可以是静态数据库表也可以是动态数据库表。   需要注意的是,ABAP的动态表在运行时可以通过添加删除修改表项的方式动态地调整表的大小。这使得动态表非常灵活,但也意味着它们在内存使用方面比静态表更为昂贵。另一方面,静态表在编译时创建,其大小固定,因此它们在内存使用方面更加节省。   此外,在选择语句中使用动态表时,需要使用INTO TABLE关键字将结果存储到表中。而对于静态表,不需要使用该关键字。   在定义动态表时,不需要指定表的大小,因为表可以在运行时动态调整大小。而静态表在定义时必须指定表的大小,因为表的大小在编译时就已经确定了。

动态表

静态表

在运行时动态创建

在编译时创建

内存使用更高,因为需要动态调整表大小

内存使用较少,因为表大小固定

可以动态添加、删除和修改表项

无法在运行时添加或删除表项

在选择语句中使用时需要使用INTO TABLE

在选择语句中使用时不需要使用INTO TABLE

定义时不需要指定表的大小

定义时需要指定表的大小

PS:动态表名称或表表达式,可以是字符串或一个动态表变量。

 静态表

  下面给出一段以SFLIGHT数据库表为基准的示例代码,从静态表中读取数据:

PS: 下面这段代码为OPEN SQL老语法。

代码语言:javascript
复制
TYPES: BEGIN OF ty_sflight,
         carrid TYPE s_carr_id,
         connid TYPE s_conn_id,
         fldate TYPE s_date,
         price  TYPE s_price,
       END OF ty_sflight.

DATA: lt_sflight TYPE STANDARD TABLE OF ty_sflight,
      ls_sflight TYPE ty_sflight.

SELECT carrid connid fldate price
FROM sflight
INTO CORRESPONDING FIELDS OF TABLE lt_sflight.

LOOP AT lt_sflight INTO ls_sflight.
  WRITE: / ls_sflight-carrid, ls_sflight-connid, ls_sflight-fldate, ls_sflight-price.
ENDLOOP.

  在上面的代码中,我们首先定义了一个结构体类型ty_sflight,用于描述从SFLIGHT表中选择的数据类型。然后,我们声明了一个静态内表变量lt_sflight,使用STANDARD TABLE OF关键字指定其类型为ty_sflight。

  接着,我们使用SELECT INTO TABLE语句从SFLIGHT表中选择数据,并将其存储到lt_sflight中。查询结果中的字段carrid、connid、fldate和price分别与ty_sflight结构体类型中的字段对应,因此可以直接存储到lt_sflight中。

  最后,我们使用LOOP AT语句遍历内表lt_sflight中的所有数据,并使用WRITE语句打印输出每一行数据的字段值。在本例中,我们使用/符号将每一行的输出放在不同的行中。

下面这段代码重构了上方的老语法代码,使用了OPEN SQL的新语法。

代码语言:javascript
复制
SELECT carrid,connid,fldate,price
FROM sflight
INTO TABLE @DATA(lt_sflight).

LOOP AT lt_sflight INTO DATA(ls_sflight).
  WRITE: / ls_sflight-carrid, ls_sflight-connid, ls_sflight-fldate, ls_sflight-price.
ENDLOOP.

 动态表

  下面给出一段以SFLIGHT数据库表为基准的示例代码,从动态表中读取数据:   下面是一个具体的案例详细讲解:

PS: 下面这段代码为OPEN SQL老语法。

代码语言:javascript
复制
DATA:GS_SFLIGHT TYPE SFLIGHT.
PARAMETERS P_SF TYPE CHAR20.
 
SELECT * FROM (P_SF) INTO GS_SFLIGHT UP TO 1 ROWS.
 WRITE:GS_SFLIGHT-CARRID, GS_SFLIGHT-CONNID.
ENDSELECT.
在这里插入图片描述
在这里插入图片描述
  • 定义一个静态数据对象 GS_SFLIGHT,类型为 SFLIGHT。
  • 定义一个参数P_SF,类型为CHAR20,用于接收动态表的名称。
  • 使用 SELECT 语句从动态表 (P_SF) 中选择所有字段,将结果集合 INTO GS_SFLIGHT 变量。
  • 使用 UP TO 1 ROWS 选项限制结果集最多只有一行
  • 使用 WRITE 语句输出 GS_SFLIGHT 变量的 CARRID 和 CONNID 字段值。
  • ENDSELECT 结束 SELECT 查询语句块。

JOIN语句

  在ABAP中,JOIN语句用于将多个表中的数据连接在一起,生成一个包含多个表中数据的结果集JOIN语句通常与SELECT语句结合使用,并且与FROM语句连接,以从多个表中检索数据。上面的例子都是从单个数据库表中获取数据,如果要从多个数据库表中获取数据则需要使用JOIN语句。   JOIN语句有多种类型,包括INNER JOINLEFT OUTER JOINRIGHT OUTER JOINFULL OUTER JOIN。以下是这些JOIN类型的简要说明:

  • INNER JOIN:只返回在两个表中都有匹配的行。
  • LEFT OUTER JOIN:返回左侧表中的所有行,以及右侧表中与左侧表匹配的行。
  • RIGHT OUTER JOIN:返回右侧表中的所有行,以及左侧表中与右侧表匹配的行。
  • FULL OUTER JOIN:返回两个表中的所有行,只要它们不是完全匹配。

PS: 在ABAP中,只支持左外连接(LEFT OUTER JOIN)和全外连接(FULL OUTER JOIN)以及内连接INNER JOIN

 INNER JOIN

  下方是一个INNER JOIN的流程示意图:

在这里插入图片描述
在这里插入图片描述

 LEFT OUTER JOIN

  下方是一个LEFT OUTER JOIN的流程示意图:

在这里插入图片描述
在这里插入图片描述

 FULL OUTER JOIN

  下方是一个FULL OUTER JOIN的流程示意图:

在这里插入图片描述
在这里插入图片描述

写在最后的话

  本文花费大量时间介绍了OPEN SQL中FROM语句的详细语法,希望能帮助到各位小伙伴,码文不易,还望各位大佬们多多支持哦,你们的支持是我最大的动力

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-03-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 数据库表准备
  • FROM语句介绍
    •  案例演示
    • 表类型选择
      •  静态表
        •  动态表
        • JOIN语句
          •  INNER JOIN
            •  LEFT OUTER JOIN
              •  FULL OUTER JOIN
              • 写在最后的话
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档