将 SELECT 用于多种用途

举报
雨绸缪 发表于 2023/10/30 16:04:47 2023/10/30
【摘要】 SELECT 语法用于从数据库表中读取数据,可以使用 ABAP SQL SELECT 语句从一个或多个数据库表(或视图)读取数据。这可以通过将结果集分配给合适的数据对象来创建多行或单行结果集。例如可以将多行读取结果存储在内部表中,或将单行结果存储在结构中。 读取单行数据到结构读取单行的所有字段语法结构:SELECT SINGLE FROM dbtab FIELDS * WHERE ......

SELECT 语法用于从数据库表中读取数据,可以使用 ABAP SQL SELECT 语句从一个或多个数据库表(或视图)读取数据。这可以通过将结果集分配给合适的数据对象来创建多行或单行结果集。例如可以将多行读取结果存储在内部表中,或将单行结果存储在结构中。

读取单行数据到结构

  1. 读取单行的所有字段

语法结构:

SELECT SINGLE FROM dbtab
  FIELDS *
  WHERE ...
  INTO @struc.        "Existing structure of dbtab's row type

SELECT 在这里的方法表示:读取单行的所有字段。指定一个“星号”*表示要读取所有字段。

  1. 读取选定字段

或者,您可以列出所有用逗号分隔的字段。读取单行的一组选定字段:

SELECT SINGLE FROM dbtab
  FIELDS comp1, comp2, comp3
  WHERE ...
  INTO @DATA(struc2).
  1. 匹配字段

不声明任何 FIELDS 的替代语法: 使用 CORRESPONDING FIELDS OF 语法。只分配目标数据对象中具有相同名称组件的列的内容。

SELECT SINGLE comp1, comp2, comp3       "Selected set of fields
  FROM dbtab
  WHERE ...
  INTO CORRESPONDING FIELDS OF @struc.

PS:日常开发中,尽量在使用 SQL 进行查询时,使用 WHERE 子句来限制读取的结果,提高查询效率。

将多行读入内部表

  1. 读取所有字段到内表
SELECT FROM dbtab
  FIELDS *              "All fields
  WHERE ...
  INTO TABLE @itab.     "itab 有适当的行类型
  1. 读取部分字段到内表
SELECT comp1, comp2, comp3
  FROM dbtab
  WHERE ...
  INTO TABLE @DATA(lv_itab). 
  1. 选定字段集,现有变量
SELECT FROM dbtab
  FIELDS comp1, comp2, comp3                "Selected set of fields
  WHERE ...
  INTO CORRESPONDING FIELDS OF TABLE @itab.

SELECT 循环:顺序读取多行

  • 如果对一个结构进行赋值,并且不使用条件 SINGLE ,则可以打开 SELECT 循环。
  • 如果找到该行,则系统字段 sy-subrc 被设置为 0 。
  • 必须使用 ENDSELECT 关闭循环。
  • 要完全终止循环,可以使用语句 EXIT
SELECT FROM dbtab
  FIELDS *
  WHERE ...
  INTO @struc.

    IF sy-subrc = 0.
      ...  "例如,对数据进行更改并将行添加到内部表中。

    ENDIF.

ENDSELECT.

SELECT语句中的子句变体和附加条件

1. 检查数据库表中是否存在行

这个经常在开发中进行使用

SELECT SINGLE @abap_true
  FROM dbtab
  WHERE ...
  INTO @DATA(exists).

IF exists = abap_true.
  ...
ENDIF.

除了使用 @abap_true,您还可以使用 “X”。

2. 使用 DISTINCT 添加删除在多行结果集中出现多次的行

不能与添加 SINGLE 一起使用,经常在 left join 或者 right join 中使用:

SELECT DISTINCT comp1
  FROM dbtab
  WHERE ...
  INTO TABLE @itab.

SELECT 列表变体

  • SELECT * ... :如上所述, * 字符定义要从数据源读取的所有列(按照此处指定的顺序)。
  • SELECT col1, col2, col3 ... :单个列名的逗号分隔列表。
  • SELECT data_source~col1, data_source~col2, data_source~col3 ... :单个列名的逗号分隔列表。在这里,数据源的名称是显式指定的,并位于列名之前,用波浪号分隔。
  • SELECT data_source~* ... :在这种情况下,数据源的名称后面跟一个波浪号和 * 字符,以指定所有列。请注意,使用此变体时存在特殊条件。
  • SELECT col1 AS al1, col2 AS al2, col3 AS al3 ...
    • 使用 AS 为结果集的各个列定义别名
    • 请确保在此处仅使用一次别名。在语句中,别名只能在 ORDER BY 子句之后使用
    • 在某些情况下(例如当使用 SQL 表达式时),需要别名的规范。还可以为数据源设置别名( SELECT FROM dbtab AS alias_name ... )。
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。