天天看點

SAP ABAP openSQL資料庫操作(二)3.提取資料3.5多表聯查3.6組合查詢結果3.7 其他格式說明

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

到的那個内表的某一個字段,相當于指定了該内表的所有字段值.

使用該結構時要確定資料庫字段與内表中關聯的字段保持一緻性.

SAP ABAP openSQL資料庫操作(二)3.提取資料3.5多表聯查3.6組合查詢結果3.7 其他格式說明

文法 :

示例:

這個兩個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>
 
           
SAP ABAP openSQL資料庫操作(二)3.提取資料3.5多表聯查3.6組合查詢結果3.7 其他格式說明

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.使用光标