工作筆記之 SELECT 語句在 SAP ABAP 中的用法總結(上)
日常開發過程中,最常用的語句可能就是查詢語句了。那麼如果從資料庫表中查詢資料呢?
答: 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 後面可以緊跟兩個關鍵字 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. 在任何行中都是不一樣的。
INTO 語句大有可能
INTO target
後面跟的語句也有幾種可能:
-
INTO
: target 為結構體,即選擇欄位值到對應結構體,參考SELECT SINGLE
示例 -
INTO CORRESPONDING FIELD OF
: 系統會幫助我們選擇和匹配對應的資料元素到相應的欄位,要求自定義的欄位名和系統的資料元素名稱一樣 -
INTO [ obj1, obj2 ...]
: 我們可以選擇一個與給定變數有關的欄位。例如,如果我們想選擇carrid
和connid
欄位,我們可以選擇這些欄位直接給相關的變數,而不是一個結構體或內表 -
INTO TABLE
: 這個功能與INTO
相似,但是我們跟的是一個表而不是一個結構體,因此可以獲取多條資料 -
INTO CORRESPONDING FIELDS OF TABLE
: 這本條功能與INTO CORRESPONDING FIELD OF
類似,區別也是在於可以獲得不止一條資料,後面跟的是能夠儲存多條結果的內表 -
APPPENDING
:當我們想追加新的記錄,而不是用新的選擇來替換它們時,可以使用APPENDING
,使用INTO
的結果就是替換
我們用程式碼來看一下 INTO
和 INTO CORRESPONDING FIELDS OF
:
SELECT carrid connid FROM sflight INTO TABLE gt_out.
複製程式碼
這條語句會將 mandt
欄位跳過,然後將 carrid
和 connid
替換成前兩條的結果,導致想要的資料和欄位並不匹配,客戶端程式碼變成了 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
部分我們只選擇了查詢 connid
和 carrid
欄位,但是在接下來的 SELECT
中,我們使用 APPENDING
語句追加了同樣的行,而且增加了 mandt
、 fldate
和 price
欄位。
總結
本文總結了 SAP ABAP 開發中最常用的查詢語句: SELECT
語句,並從主體的三個部分進行語法拆解, SELECT result FROM source INTO target
,並分別介紹了它們的功能和可能會使用的語句。今後也會將這段時間以來的筆記總結並分享,希望對今後從事 SAP 開發的人有所幫助!
劃線
評論
複製
- 那些 Go 語言發展歷史上的重大決策
- 從趨勢到挑戰,一站式解讀作業系統運維和可觀測性
- 百萬級 Topic,騰訊雲的 Apache Pulsar 穩定性實踐
- Apache Doris 在思必馳的應用優化實踐:海量語音通話資料下,實時、離線一體的數倉架構設計實踐
- 愛數正式開源認知智慧開發框架 KWeaver
- 運維智慧化的三大關鍵技術
- “抄我的還‘反捅’我一刀”,Gary Marcus 發文駁斥圖靈獎得主 Yann LeCun
- 當出海成為必選項,企業如何構建全場景全生態技術底座?
- 數智底座必備能力三:快速構建創新應用
- Docker 多階段構建實戰 (multi-stage builds)
- 工作筆記之 SELECT 語句在 SAP ABAP 中的用法總結(上)
- 經久不衰的設計定律是不要讓我思考的設計
- 不要指望下一個像 GPT 這樣的大型語言模型會民主化
- Java 近期新聞:Helidon Níma、Spring Framework、MicroProfile、MicroStream、Kotlin 和 Piranha
- 一文入門 jQuery
- C 學習 ---__libc_open 函式的原理
- 監控系統工作原理
- 甲骨文新微服務框架 Helidon Níma:使用虛擬執行緒實現高效能
- 【雲原生 | 從零開始學 Kubernetes】二、使用 kubeadm 搭建 K8S 叢集
- Elasticsearch 聚合學習之四:結果排序