工作筆記之 SELECT 語句在 SAP ABAP 中的用法總結(上)

語言: CN / TW / HK

日常開發過程中,最常用的語句可能就是查詢語句了。那麼如果從資料庫表中查詢資料呢?

答: select from 語句。

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 後面可以緊跟兩個關鍵字 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 開發的人有所幫助!

劃線

評論

複製