SAP ABAP openSQL資料庫操作(一)
SAP ABAP openSQL資料庫操作(三)
SAP ABAP openSQL資料庫操作(四)
文章目錄
- 3.提取資料
- 3.5多表聯查
-
- 1.SELECT語句嵌套
- 2.FOR ALL ENTRIES 選項
- 3.結合查詢
- 5.子查詢
- 3.6組合查詢結果
-
- 1. 總計功能
- 2. 分組總計
- 3.指定分組條件
- 4.排序
- 3.7 其他格式說明
-
- 1.動态指定資料庫表名
- 2. 指定資料區域
- 3.設定緩沖機制
- 5.限定選擇行數
- 6.操作性能分析
3.提取資料
3.5多表聯查
多表聯查的方式有左連接配接,内連接配接,右連接配接,子查詢等,理論上來說子查詢的效率是最低的.
1.SELECT語句嵌套
*一個select的結果做另一個的select的條件
SELECT carrid connid
FROM spfli
INTO (wa_carrid,wa_connid)
WHERE cityfrom = 'SINGAPORE'.
SELECT carrname
FROM scarr
INTO wa_carrname
WHERE carrname = 'wa_carrid'.
WRITE / wa_carrname.
ENDSELECT.
ENDSELECT.
2.FOR ALL ENTRIES 選項
以上面的SQL為例,他是把
WHERE cityfrom = 'SINGAPORE'
這個所有滿足條件的
FOR ALL ENTRIES
到一個内表中,然後在根據這個内表中的資料再去查詢相應的結果.
一旦指定了
FOR ALL ENTRIES
到的那個内表的某一個字段,相當于指定了該内表的所有字段值.
使用該結構時要確定資料庫字段與内表中關聯的字段保持一緻性.
文法 :
示例:
這個兩個select不是嵌套關系,而是并聯關系.
SELECT carrid connid
FROM spfli
INTO (wa_carrid,wa_connid)
WHERE cityfrom = 'SINGAPORE'.
SELECT carrname
FROM scarr
INTO wa_scarr
FOR ALL ENTRIES IN spfli_tab1
WHERE carrname = spfli_tab1-carrid.
WRITE / wa_carrname.
ENDSELECT.
ENDSELECT.
3.結合查詢
包括
inner join
和
left outer join
inner join
取兩張表的
交集
SELECT * FROM table
INNER JOIN jointtable1 [AS jt1] ON <condition>
INNER JOIN jointtable2 [AS jt2] ON <condition>
table
為主表其他的為結合表
AS
的是别名,
每一個條件中必須包含一個主表的字段.
SELECT spfli~carrid ,scarr~carrname ,spfli~connid
FROM spfli
INNER JOIN scarr ON scarr~carrid = spfli~carrid
INTO (wa_carrid,wa_connid,wa_carrname)
WHERE spfli~cityfrom = 'SINGAPORE'.
ENDSELECT.
left outer join
與
inner join
主要差別是左連接配接中,對于主選擇表的資料,即使在結合表中條件字段值不存在,也将該資料行選出,結合表中不存在的字段保持空白,
在
NO
中隻能使用 “=” 操作符,且必須至少有一個條件是對主表和結合表中的字段進行比較
如圖:
SELECT * FROM table
LEFT JOIN jointtable1 [AS jt1] ON <condition>
5.子查詢
如果在一個表中查詢資料時需要與其他表中的某些字段相關聯,則可以使用子查詢.
子查詢沒有
INTO
語句,是用
EXISTS
IN
WHERE
進行連接配接,不可結合
NO
同時使用.
1. 使用
EXISTS
SELECT * FROM scarr
INTO TABLE wa_scarr
WHERE EXISTS ( SELECT * FROM spfli WHERE carrid = scarr~carrid AND cityfrom = 'SINGAPORE' ).
2. 使用
IN
則需要子查詢傳回字段
SELECT * FROM scarr
INTO TABLE wa_scarr
WHERE city IN ( SELECT * FROM spfli WHERE carrid = scarr~carrid AND cityfrom = 'SINGAPORE' ).
3. 使用
=
邏輯運算需要區分單行和多行的結果集
單行結果集
SELECT * FROM scarr
INTO TABLE wa_scarr
WHERE city = ( SELECT * FROM spfli WHERE carrid = scarr~carrid AND cityfrom = 'SINGAPORE' ).
4. 多行結果集.多行的需要注意的是在子查詢之前需要注明
ALL
ANY
SOME
ALL
表示滿足條件的所有行;
ANY SOME
表示至少有一行滿足的
SELECT * FROM scarr
INTO TABLE wa_scarr
WHERE city > ALL ( SELECT * FROM spfli WHERE carrid = scarr~carrid AND cityfrom = 'SINGAPORE' ).
3.6組合查詢結果
1. 總計功能
MAX(最大值) MIN(最小值) SUM(和) AVG(平均值) COUNT(行數)
文法:
s1為字段,a1位目标變量
SELECT carrid connid sum( seatsocc )
FROM sflight
INTO (wa_carrid,wa_connid,sum_seatsocc)
WHERE spli~cityfrom = 'SINGAPORE'.
上述中的
sum( seatsocc )
的結果或存放在變量
sum_seatsocc
2. 分組總計
可以使用
GROUP BY
進行分組.
試講資料庫表中一組某些指定字段值相同的行中的内容組合到單行中,其他字段則可以通過總計功能進行求和.
分組總計隻能應用在查詢中,是以隻有指定單獨基本字段清單或使用
INTO CORRESPONDING FIELDS
的
SELECT
語句方可.
文法:
SELECT s1 [AS a1] s2 [AS a2]
agg( s3 ) [AS a3]
INTO (f1,f2,f3) | CORRESPONDING FIELDS OF itab
GROUP BY s1 s2 ..
上述的s1 s2字段值全部相同的字段資料行被組合成一行,而s3字段則需要進行統計字段.
SELECT carrid MIN( price ) MAX( price )
INTO (carrid, min_mun,max_mun)
FROM sflight
GROUP BY carrid.
ENDSELECT.
3.指定分組條件
給分組添加條件使用
HAVING
他的作用是和
WHERE
一樣 .
SELECT s1 [AS a1] s2 [AS a2]
agg( s3 ) [AS a3]
INTO (f1,f2,f3) | CORRESPONDING FIELDS OF itab
GROUP BY s1 s2
HAVING <condition>.
但是注意區分,前者一般隻用于分組,後者一般使用其他的條件查詢.
SELECT carrid MIN( price ) MAX( price )
INTO (carrid, min_mun,max_mun)
FROM sflight
GROUP BY carrid
*隻篩選大于1000的資料
HAVING MIN(min_mun) > 1000.
ENDSELECT.
4.排序
排序分升序
ASCENDING
和降序
DESCENDING
系統預設是升序,排序是從左到右進行.
如果資料庫系統查詢和排序使用的是相同的索引時一般會在SQL上進行排序,否則就是
SELECT
完之後再通過
SORT BY f1 f2 f3..
對内表字段進行排序.
SELECT carrid MIN( price ) MAX( price )
INTO (carrid, min_mun,max_mun)
FROM sflight
GROUP BY carrid
ORDER BY carrid ASCENDING
max DESCENDING.
ENDSELECT.
3.7 其他格式說明
1.動态指定資料庫表名
db_name
這個變量字元必須是大寫的.
不能使用表工作區忽略into子句
SELECT * FROM (db_name)..
db_name = 'SPFLI'
SELECT carrid FROM (db_name)
INTO (carrid)
WHERE cityfrom = 'BIEJING'.
2. 指定資料區域
每張資料庫表都會一個主鍵字段"集團",在我們進行資料庫操作的時候系統就會自動指定集團處理,如果要不想處理該集團可以使用語句
CLIENT SPECIFED
來取消自盾構處理的功能
該語句必須在資料庫表後面.
關閉後我們使用
WHERE
語句貨工作區指定abap中的集團字段.
SELECT * FROM spfli CLIENT SPECIFIED
INTO TABLE wa_spfli
WHERE mandt BETWEEN '100' AND '102'.
這樣語句就會查詢集團100到102中存儲的資料,而不會考慮使用者登入的集團id.
3.設定緩沖機制
資料庫表的緩沖機制是和Redis的作用是類似的,都用來存放臨時資料.但該緩沖機制的功能可沒有Redis的功能強大.Redis參考1 / Redis參考2
而該緩沖機制是把首次讀取到的資料儲存到應用伺服器記憶體中.
可分為表内容緩沖;部分内容緩沖;單行資料緩沖.
我們在使用緩沖機制的時候應當注意與資料庫的一緻性檢查,防止髒讀幻讀等形式的資料錯誤.
使用語句
BYPASSING BUFFER
注意:在使用資料去重函數查空值組排序時将自動忽略緩沖設定.
5.限定選擇行數
指定查詢多少行資料
如果n>0最多選n行
如果n=0選擇所有滿足條件的
如果使用ORDER BY 系統有限選擇滿足條件的,然後排序,最後選擇前n行資料.
6.操作性能分析
使用
GET RUN TIME
擷取系統目前運作事件
f為int類型字段 f/ms
REPORT z_runtime_analysis.
DATA:wa_carrid TYPE spfli-carrid,
wa_connid TYPE spfli-connid,
wa_carrname TYPE scarr-carrname.
DATA:t1 TYPE i,
t2 TYPE i,
time TYPE i,
n TYPE i VALUE 1000.
DO n TIMES.
GET TIME FIELD t1.
SELECT carrid connid
FROM spfli
INTO (wa_carrid,wa_connid)
WHERE cityfrom = 'SINGAPORE'.
SELECT carrname
FROM scarr
INTO wa_carrname
WHERE carrid = wa_carrid.
ENDSELECT.
ENDSELECT.
GET TIME FIELD t2.
time = time + t2 - t1.
ENDDO.
WRITE : / 'runtime:', time.
需要對複雜的程式進行分析可以使用
SE30
參考:SAP ABAP debug的七種方法及錯誤消息定位第五個使用的就是
SE30
這個工具
8.使用光标