SQL文について
SAPではSAP HANA以外にMicrosoftやOracleのDBも使用することができる。
こういったDBからデータを取ってくるときに使用するのがSQL文だ。
SAPで使用できるSQL文
SAPで使用できるSQL文は以下の2つだ。
・OPEN SQL
・NATIVE SQL
OPEN SQLについて
DBテーブルからデータを取得するときにアドオンプログラムで使用するのは圧倒的にこのOPEN SQL。
OPEN SQLを使用すると使用しているDBがどれであっても(HANA,Microsoft,Oracleなどに関わらず)同じ書き方でデータを取得することが可能だ。
(OPEN SQLを使うとSAP側で自動でOPEN SQL→NATIVE SQLの変換を行ってくれるため。)
OPEN SQLは「SELECT」というABAPKeywordでプログラム中で使用することが可能。
取得できるデータはABAPデータディクショナリに登録されているDBテーブルのみという点は注意が必要。
NATIVE SQLについて
NATIVE SQLではSAPでの変換を挟まずに直接DBにデータを取りに行くことが可能。そのため、ABAPデータディクショナリに登録されていないテーブルも使用することが可能だ。
OPEN SQLでは実現できないような条件でデータを取得することも可能となる。
NATIVE SQLは「EXEC」~NATIVE SQL ステートメント~「ENDEXEC」と書くことで使用することが可能。
DBごとの固有のSQL文を使用するのでDBが異なるとSQL部分の書き方も異なるので注意が必要だ。
SQL Statementについて
・DDL Statement
テーブルの作成や削除、構造の変更などが可能。
・DML Statement
データの操作を行うことが可能。
SQL Statement自体は使用しているDBによって書き方が変わるため、その都度調べる必要がある点に注意が必要だ。
OPEN SQLでのDBからのデータ取得方法
OPEN SQLでDBテーブルからデータを取得するには、「SELECT」を使用する。
基本的な使い方は以下の通り。
◇ワークエリアにデータを格納する場合
SELECT 取得したいDBテーブルのコンポーネント名
FROM 取得したいDBテーブル名
INTO 取得したデータを格納するワークエリア名
WHERE 条件.
◇内部テーブルにデータを格納する場合
SELECT 取得したいDBテーブルのコンポーネント名
FROM 取得したいDBテーブル名
INTO TABLE 取得したデータを格納するワークエリア名
WHERE 条件.
SELECTはほかにも使用方法や種類が以下の通りいくつかある。どれも使うことが多いので覚えておこう。
・SELECT SINGLE
文字通り、条件に該当するデータを1件だけ取得する。データの存在チェックに使用することが多い。
・UP TO N ROWS
「N」の部分に入れた数字の分、データを取得
(1とした場合、1件だけ取得)
SELECT SINGLEと同じ様に1件だけ取得して存在チェックに使用することが多い。
☆SELECT SINGLEとUP TO 1 ROWSの使い分け
パフォーマンス面はほとんど差がない。
WHERE句で完全な主キーを指定できる場合、SELECT SINGLEを
完全な主キーは指定できない場合はUP TO 1ROWSを使用することが多いようだ。
・SELECT ~ ENDSELECT.
条件に該当するデータを1レコードずつワークエリアに格納、該当するレコードがなくなるまでLOOPする。
1件ずつ取得したデータを編集しつつ別内部テーブルなどに格納することが可能だ。
取得したデータ(加工前)をほかの場所でも使用する場合は1度INTO TABLEで内部テーブルに取得し、
その内部テーブルをLOOPしてさらに別の内部テーブルに編集後データを入れなおす方がおすすめ。
・SELECT *
SELECTの後ろにコンポーネント名ではなく「*」を書くと、WHERE句に書いた条件に当てはまる(WHERE句がない場合は全データ)を取得することが可能だ。
テーブルのコンポーネントやレコード数が少ない場合は行っても問題ないが、どのコンポーネントが取ってきたかったのか分かりにくくなってしまうのであまりおすすめしない。面倒ではあるが取得する全コンポーネントを指定しよう。
複数のテーブルからデータを取得
複数のテーブルからデータを取得する場合、以下の方法が使用されることが多い。
・FOR ALL ENTRIES
・結合
FOR ALL ENTRIESについて
FOR AL ENTRIESを使用すると、SELECTのWHERE句にほかの内部テーブルを使用することが可能になる。
イメージは以下の通り。
![](https://abap-study.com/wp-content/uploads/2020/08/image-19.png)
まず、FOR ALL ENTRIESで使うためのSELECTを実施する。
SELECT 商品名
FROM DBテーブルA
INTO TABLE 内部テーブルA
WHERE 商品名 = ポテト
AND 商品名 = コーラ
次にFOR ALL ENTRIESを使用したSELECTを実施する。
SELECT 商品名
サイズ
価格
FROM DBテーブルB
INTO TABLE 内部テーブルB
FOR ALL ENTRIES IN 内部テーブルA
WHERE 商品名 = 内部テーブルA-商品名
【注意!①】
FOR ALL ENTRIES IN で指定する内部テーブル(上の例では内部テーブルA)が空っぽの場合、すべてのデータを取得してしまうため注意が必要だ。
FOR ALL ENTRIESを使用する場合はSELECTの前に
IF 内部テーブルA IS NOT INITIAL.
などで必ずデータが存在することを確認しよう。
【注意!②】
FOR ALL ENTRIESを使用した場合、取得したデータで重複している部分は自動で削除されてしまう。必ずキー項目はすべて取得するように注意しよう。
【注意!③】
SQL式(SELECT内での計算やCASEなど)やUNIONはFOR ALL ENTRIESと併用することができない。
FOR ALL ENTRIESを使用して取得した後、内部テーブルに対してSQL式でやろうとしていたことを行うか、FOR ALL ENTRIESで使用したいテーブルをレンジテーブルなどにして別の形で使用するかなどの対応が必要だ。
結合について
ABAPで使用する結合には以下の2つが存在する。
・内部結合(INNER JOIN)
キー項目が結合するお互いのテーブルに存在するデータを取得する
・外部結合(OUTER JOIN)
キー項目がお互いのテーブルに存在しなくても最初のテーブルからデータを取得する
イメージはそれぞれ以下の通り。
![](https://abap-study.com/wp-content/uploads/2020/08/image-20.png)
基本的な使い方はそれぞれ次の通り。
・内部結合(INNER JOIN)
SELECT A~商品名
A~価格
B~割引後価格
FROM DBテーブルA AS A
INNER JOIN DBテーブルB AS B
ON A~商品名 = B~商品名
INTO TABLE 内部テーブルA.
・外部結合(OUTER JOIN)
SELECT A~商品名
A~価格
B~割引後価格
FROM DBテーブルA AS A
LEFT OUTER JOIN DBテーブルB AS B
ON A~商品名 = B~商品名
INTO TABLE 内部テーブルA.
使用するときには以下の点に注意しよう。
・FROMとINNER JOIN 、LEFT OUTER JOINの後ろに書くDBテーブル名のさらに後ろにAS 「XX」とそのDBテーブルのSELECT文中での名前をつける必要がある。
・JOINを使用するSELECTのコンポーネント名の前にはASの後ろのテーブル名~コンポーネント名とする必要がある。
・JOINで結合できるDBテーブルは最大で25個。
そこまで結合することは少ないが覚えておこう。
・LEFT OUTER JOINはLEFT JOINと省略して書くことも可能だ。
また、上記の例では使用していないがWHERE句を使用しての条件指定も可能だ。
UNIONについて
UNIONを使用すると2つのSELECT文を結合することが可能だ。
・UNION
重複しているデータは自動で削除する。
・UNION ALL
重複データも削除せずすべて取得する。
イメージは以下の通りだ。
![](https://abap-study.com/wp-content/uploads/2020/08/image-21.png)
使い方はそれぞれ次の通り。
・UNION
SELECT 商品名
価格
FROM DBテーブルA
UNION
SELECT 商品名
割引後価格
FROM DBテーブルB
INTO TABLE 内部テーブル.
・UNION ALL
SELECT 商品名
価格
FROM DBテーブルA
UNION ALL
SELECT 商品名
割引後価格
FROM DBテーブルB
INTO TABLE 内部テーブル.
UNIONを使用するときは以下の点に注意しよう。
・1つ目のSELECTと2つ目のSELECTで取得するコンポーネントの数や形が同じでないとエラーになってしまう。
・WHERE句で条件を付ける場合は、それぞれのSELECTに書く必要がある。
・結果をソートしたい場合はORDER BYを使用しよう。
SELECTのオプション
SELECTにはいくつかオプションがある。
どれも便利なので覚えておこう。
・ORDER BY
取得した結果を並べ替えることが可能。
・GROUP BY
指定したコンポーネントごとに集約することが可能。
・HAVING
GROUP BY の条件を指定することが可能。
・CASE
SELECT文中にCASE文を書いて分岐させることが可能。
・インライン宣言
事前にワークエリアや内部テーブルを宣言しておかなくてもインライン宣言を使用することでデータを格納することが可能だ。
使い方は次の通り。
ワークエリア
INTO @DATA(ワークエリア名)
内部テーブル
INTO TABLE @DATA(内部テーブル名)
以下のオプションはGROUP BYと合わせて使用する。
・AVG
指定したコンポーネントの平均を返すことが可能。
・MAX
指定したコンポーネントの最大値を返すことが可能。
・MIN
指定したコンポーネントの最小値を返すことが可能。
・COUNT
GROUP BYを使用した場合はその集約ごとの件数、GROUP BYを使わない場合はテーブルの件数を返す。
・SUM
指定したコンポーネントの合計を返すことが可能。
コメント