SAP(三)-OPEN SQL--SELECT、INTO、FROM、INNER JOIN与OUTER JION 、WHERE、GROUPING、HAVING、SORT、Subquery

  1. SELECT语句

INTO语句的结果不是保存到内表,是字段或者结构体时,最后要加ENDSELECT语句。这种语句相当于LOOP循环中执行SELECT语句,每取出一条数据,就把它追加到结构体中,一直读取全部符合条件的数据为止。
1.使用结构体


*使用了结构体,因此使用SELECT  ENDSELECT 语句。

  DATA : gs_zht6 TYPE STANDARD TABLE OF ZHR_TRAIN_ZHT_1 ,
        gs_zht7 TYPE ZHR_TRAIN_ZHT_1 .

         SELECT * INTO gs_zht7 FROM ZHR_TRAIN_ZHT_1
           WHERE name EQ '周0' .
           WRITE : / gs_zht7-sex,
                   / gs_zht7-tel.
         ENDSELECT.

2.使用内表

*使用了内表一次保存所有的值,因此不存在ENDSELECT.
  DATA : gs_zht9 TYPE STANDARD TABLE OF ZHR_TRAIN_ZHT_1 ,
        gs_zht8 TYPE ZHR_TRAIN_ZHT_1 .

        SELECT * INTO TABLE gs_zht9 FROM ZHR_TRAIN_ZHT_1
          WHERE name EQ '周0' .

         LOOP AT gs_zht9 INTO gs_zht8 .
         WRITE : / gs_zht8-tel,
                / gs_zht8-sex.
         ENDLOOP.

2.动态SELECT语句
可以定义动态的SELECT语句字段,保存gs_line 最多可以容纳72位char类型。结构体gs_line位null时与*语句相同。

DATA : gt_itab TYPE STANDARD TABLE OF sflight,
       gs_wa LIKE LINE OF gt_itab,
       gs_line(72) TYPE c,
       gt_list LIKE TABLE OF gs_line(72).
       gs_line = 'CARRID CONNID'.
 SELECT DISTINCT (gs_line) INTO TABLE gt_itab
   FROM sflight.
   IF sy-subrc EQ 0.
     LOOP AT gt_itab INTO gs_wa.
       WRITE : /gs_wa-carrid,gs_wa-connid.
       ENDLOOP.
      ENDIF.

3.INTO语句

into [wa] :把数据选择出来放入工作区[wa]中。
注意:如果是select f1 f2 … fn into wa的时候,wa中的字段数一定要大于等于n的个数,不然会出现runtime error 。
如果数据库中只有一条记录,那么endselect语句被忽略。因为是每次选出一条记录,所以endselect语句是必须的。

实例:

DATA: BEGIN OF wa1,
        client   TYPE scarr-mandt,
        carrid   TYPE scarr-carrid,
        carrname TYPE scarr-carrname,
        url      TYPE scarr-url,
        rest(100),
      END OF wa1.
SELECT * INTO wa1 FROM SCARR.
  WRITE: / wa1-carrid, wa1-carrname.
ENDSELECT.

INTO CORRESPONDING FIELDS OF wa:把数据选择到wa中的相应字段中。这个语句和上面的语句唯一的区别就是,指定的字段名称问题。 因为选择数据的时候数据库中会有一个比较的过程,所以这个方式不如上面的方式速度快。只要注意wa中字段命名的问题,可以避免使用corresponding语句。
INTO (f1, …, fn):把选择出来的数据分别放到几个变量中,into的变量数和select的变量的个数必须相等。
实例:

DATA:  carrid   TYPE scarr-carrid,
       carrname TYPE scarr-carrname.
       CARRNAME LIKE SCARR-CARRNAME,
SELECT carrid carrname
       INTO (carrid, carrname)
       FROM scarr.
  WRITE: / carrid, carrname.
ENDSELECT.

 INTO TABLE itab
INTO CORRESPONDING FIELDS OF TABLE itab
这两个语句的区别同into wa 和into corresponding field of wa一样,因为这个是把选择出来的数据放到内表中,所以不需要endselect语句了。
APPENDING TABLE itab
APPENDING CORRESPONDING FIELDS OF TABLE itab :和上面的into table itab等一样,也是把取得的数据加到内表中,无需endselect 。

4.FROM语句

PARAMETERS p_name TYPE char10.
DATA GS_WA TYPE SFLIGHT.
SELECT SINGLE * INTO gs_wa
  FROM (p_name)
  WHERE carrid = 'AA'.

5.INNER JOIN与OUTER JION
与数据库差不多。添加链接描述
INNER JOIN


TYPES : BEGIN OF t_str ,
  carrid TYPE sflight-carrid ,
  carrname TYPE scarr-carrname ,
  END OF t_str.

  DATA : gs_str TYPE t_str.
  SELECT SINGLE a~carrid b~carrname
    INTO CORRESPONDING FIELDS OF gs_str
    FROM sflight AS a
    INNER JOIN scarr AS b
    ON  a~carrid EQ b~carrname
    WHERE a~carrid = 'AA'.

    WRITE : gs_str-carrid , gs_str-carrname.

OUTER JION


TYPES : BEGIN OF t_str ,
  carrid TYPE sflight-carrid ,
  carrname TYPE scarr-carrname ,
  END OF t_str.

  DATA : gs_str TYPE t_str.
  SELECT SINGLE a~carrid b~carrname
    INTO CORRESPONDING FIELDS OF gs_str
    FROM sflight AS a
    LEFT OUTER JOIN scarr AS b
    ON  a~carrid EQ b~carrname
    WHERE a~carrid = 'AA'.

    WRITE : gs_str-carrid , gs_str-carrname.

6.WHERE语句

动态查询

**  动态给出查询条件的程序
  DATA gs_where   TYPE C LENGTH 72.
  DATA gv_carrname TYPE scarr-carrname.
  DATA gv_carrid TYPE scarr-carrid VALUE 'AC'.
**  给CARRID加引号,然后A要给AC加引号,才会认为是一个值不是一个变量,
**  我也感觉这个方式有点傻11111,能不用就不用
  CONCATENATE  ` CARRID = ` `'` gv_carrid `'` INTO gs_where.
  SELECT SINGLE carrname
      INTO gv_carrname
    FROM scarr
    WHERE (gs_where).
    WRITE / gv_carrname.

当需要查询两个以上的条件时需要把查询条件追加到内表中使用。相当于一个查询搜索框,可以重复查询表里面的内容。

DATA gs_where TYPE c LENGTH 72.
DATA gt_where LIKE TABLE OF gs_where.
DATA gv_carrname TYPE scarr-carrname.
* DATA gv_carrid1 TYPE scarr-carrid VALUE 'AC'.
* DATA gv_carrid2 TYPE scarr-carrid VALUE 'AF'.

PARAMETERS:
  p_car1 TYPE char2,
  p_car2 TYPE char2.

START-OF-SELECTION.

* 我又要写了一下''''''这个动态查询
  CONCATENATE  ` CARRID = ` `'` p_car1 `'` INTO gs_where.
  APPEND gs_where TO gt_where.
  gs_where = 'OR'.
  APPEND gs_where TO gt_where.
  CONCATENATE  ` CARRID = ` `'` p_car2 `'` INTO gs_where.
  APPEND gs_where TO gt_where.
  SELECT carrname
    INTO gv_carrname
    FROM scarr
    WHERE (gt_where).
*   gt_where=CARRID = AC or CARRID = AF
    WRITE / gv_carrname.
  ENDSELECT.

如果想简单查询可以这样写

 DATA gt_where TYPE scarr.
  SELECT carrname INTO gt_where-carrname FROM scarr
    WHERE carrid = 'AC' OR carrid = 'AF'.
    WRITE / gt_where-carrname.
  ENDSELECT.

7.FOR ALL ENTRIES

①使用该选项后,对于最后得出的结果集,系统会自动删除重复行。

②FOR ALL ENTRIES IN后面使用的内部表itab如果为空,将查处当前CLIENT端所有数据。

③内表中的条件字段不能使用BETWEEN、LIKE、IN比较符。

④使用该语句时。ORDER BY语句和HAVING语句将不能使用。

⑤使用该语句时,除COUNT(*)(并且如果有了count函数,则不能再选择其他字段,只能使用在select…endselect语句汇总中)以外的所有合计函数(MAX、MIN、AVG、SUM)都不能使用。

*  定义一个内表itab_add,内表的结构是跟类型spfli是一致的.
 DATA : gt_spfli TYPE TABLE OF spfli ,
  gt_sflight TYPE TABLE OF sflight,
  gs_sflight TYPE sflight.

SELECT * FROM spfli INTO TABLE gt_spfli.
  SELECT * FROM sflight  INTO TABLE gt_sflight FOR ALL ENTRIES IN gt_spfli
    WHERE carrid = gt_spfli-carrid
    and connid = gt_spfli-connid.

    LOOP AT gt_sflight INTO gs_sflight.
      WRITE : / gs_sflight-carrid ,gs_sflight-connid.
      ENDLOOP.

7.INSERT
一条语句
INSERT INTO …VALUES…
INSERT…FROM…
INSERT …

 DATA : gs_scarr TYPE scarr.
          gs_scarr-carrid = 'CN'.
          gs_scarr-carrname = 'Air china'.
          gs_scarr-url = 'http://www.airchina.kr/'.
          INSERT INTO SCARR VALUES GS_SCARR.

插入多条数据,为了避免插入相同主键时发生错误,所以要加上ACCEPTING DUPLICATE KEYS语句。

 DATA : gt_spfli TYPE TABLE OF spfli,
           gs_spfli TYPE spfli.

      gs_spfli-carrid = 'CN'.
      gs_spfli-connid = '0001'.
      gs_spfli-cityfrom = 'Beijing'.
      gs_spfli-cityto = 'Seoul'.
      APPEND gs_spfli TO gt_spfli.

      gs_spfli-carrid = 'CN'.
      gs_spfli-connid = '0002'.
      gs_spfli-cityfrom = 'Beijing'.
      gs_spfli-cityto = 'Busan'.
      APPEND gs_spfli TO gt_spfli.


      INSERT spfli FROM TABLE gt_spfli ACCEPTING DUPLICATE KEYS.

事务码:se11

SAP(三)-OPEN SQL--SELECT、INTO、FROM、INNER JOIN与OUTER JION 、WHERE、GROUPING、HAVING、SORT、Subquery_第1张图片显示字段数据类型。

SAP(三)-OPEN SQL--SELECT、INTO、FROM、INNER JOIN与OUTER JION 、WHERE、GROUPING、HAVING、SORT、Subquery_第2张图片显示表里的具体数据。
SAP(三)-OPEN SQL--SELECT、INTO、FROM、INNER JOIN与OUTER JION 、WHERE、GROUPING、HAVING、SORT、Subquery_第3张图片事务码se16查找表,点进去也可以看到具体数据类型和具体内容。
SAP(三)-OPEN SQL--SELECT、INTO、FROM、INNER JOIN与OUTER JION 、WHERE、GROUPING、HAVING、SORT、Subquery_第4张图片也可以从包里查看数据库表,后续步骤和上面一样。
SAP(三)-OPEN SQL--SELECT、INTO、FROM、INNER JOIN与OUTER JION 、WHERE、GROUPING、HAVING、SORT、Subquery_第5张图片
8.UPDATE

修改一条数据
UPDATE INTO …
UPDATE…FROM…
UPDATE …

多条数据。
UPDATE…FROM TABLE…
UPDATE…SET…WHERE…


      DATA gs_spfli TYPE spfli.

      MOVE 'CN' TO gs_spfli-carrid.
      MOVE '0001' TO gs_spfli-connid.
      MOVE 'Beijing' TO gs_spfli-cityfrom.
      UPDATE spfli FROM gs_spfli.

      UPDATE spfli
      SET CITYTO = 'Shanghai'
      WHERE carrid = 'CN'
      AND CONNID = '0002'.

      IF SY-SUBRC eq 0.
        WRITE 'Update is success!'.
      ENDIF.

      WRITE : / gs_spfli-carrid , / gs_spfli-connid , / gs_spfli-cityfrom .
      

9.MODIFY
MODIFY既有update的功能也有Insert的功能。
修改一条数据
MODIFY…FROM…
MODIFY…

多条数据。
MODIFY…FROM TABLE…
数据库的主键是carrid和connid,第一个modify 是利用工作区往数据路表spfli追加数据。因此执行第二个modify时,第一条数据
执行update操作。而表中不存在0003的数据,因此执行insert功能。
查看主键:
SAP(三)-OPEN SQL--SELECT、INTO、FROM、INNER JOIN与OUTER JION 、WHERE、GROUPING、HAVING、SORT、Subquery_第6张图片

 DATA : gt_spfli TYPE TABLE OF spfli,
           gs_spfli TYPE spfli.

      gs_spfli-carrid = 'CN'.
      gs_spfli-connid = '0001'.
      gs_spfli-cityfrom = 'Beijing'.
     MODIFY spfli FROM gs_spfli.

      gs_spfli-carrid = 'CN'.
      gs_spfli-connid = '0001'.
      gs_spfli-cityfrom = 'Shanghai'.
      APPEND gs_spfli TO gt_spfli.

        gs_spfli-carrid = 'CN'.
      gs_spfli-connid = '0003'.
      gs_spfli-cityfrom = 'Shanghai'.
      APPEND gs_spfli TO gt_spfli.

      MODIFY spfli FROM TABLE gt_spfli.

下面是用画面输入的DML语句执行SQL语句的程序。

PARAMETERS : p_sql(255) TYPE c.

DATA : go_sql TYPE REF TO cl_sql_statement.
DATA : gv_sql TYPE string.
DATA : gd_ret TYPE i.

CREATE  OBJECT go_sql.
 gv_sql = p_sql.
 TRANSLATE gv_sql TO UPPER CASE.

 CALL METHOD go_sql->execute_update
 EXPORTING
   statement = gv_sql
 RECEIVING
 rows_processed = gd_ret.

SAP(三)-OPEN SQL--SELECT、INTO、FROM、INNER JOIN与OUTER JION 、WHERE、GROUPING、HAVING、SORT、Subquery_第7张图片

你可能感兴趣的:(SAP)