Db2 : 外部結合にOracle独自の「(+)」を使用


Db2には以前から、Oracle用の互換フィーチャーが用意されており、
（レジストリ変数 DB2_COMPATIBILITY_VECTOR をセットして利用する）

Oracle用に作成されたアプリケーションを、なるべく作り直さずにDb2で使用できるようになっています。

この互換フィーチャーはバージョン毎にUpdateや追加されており、
現在の最新バージョンであるDb2 11.5の、一つ前のバージョンであるDb2 for LUW 11.1からは、Oracle独自の外部結合(OUTER JOIN)の書き方である「(+)」は、レジストリ変数をセットする必要なく、デフォルトで使用できるようになっています。

つまり、Db2で「(+)」は、何も事前準備をせずに使えるため、気軽に使えるようになっています。

[補足] Db2 10.5までは、外部結合演算子にOracle独自の「(+)」を使うためには、以下のように、DB2_COMPATIBILITY_VECTOR レジストリー変数を 16 進値 0x04 (ビット位置 3) に設定して外部結合演算子のサポートを有効にしてから、インスタンスの停止・再始動をする必要がありました。
現在は以下の設定は不要です。



```
db2set DB2_COMPATIBILITY_VECTOR=04
db2stop
db2start

```

# Db2で外部結合に「(+)」を使う

まず、Db2は標準SQLに準拠しているため、LEFT/RIGHT OUTER JOINといった、標準SQLの結合シンタックスを使うことができます。

加えて、Oracle独自の書き方である「(+)」も代替構文として使えます。

例えば、

```
SELECT * FROM T1,T2
WHERE T1.C1=T2.C2 (+)

```

と書くこともでき、以下と同じこととなります。

```
SELECT * FROM T1 LEFT OUTER JOIN T2 ON T1.C1=T2..C2

```

# Db2のSAMPLEデータベースで「(+)」を試してみる

Db2のSAMPLEデータベースで用意されている、DEPARTMENT表とEMPLOYEE表を、LEFT OUTER JOINしてみます。

まずは、標準SQLの LEFT OUTER JOIN の構文を使ってみます。

```
SELECT DEPTNAME, LASTNAME FROM
  DEPARTMENT D LEFT OUTER JOIN EMPLOYEE E
  ON D.DEPTNO = E.WORKDEPT


DEPTNAME                             LASTNAME
------------------------------------ ---------------
SPIFFY COMPUTER SERVICE DIV.         HAAS
PLANNING                             THOMPSON
INFORMATION CENTER                   KWAN
SUPPORT SERVICES                     GEYER
MANUFACTURING SYSTEMS                STERN
ADMINISTRATION SYSTEMS               PULASKI
OPERATIONS                           HENDERSON
SOFTWARE SUPPORT                     SPENSER
SPIFFY COMPUTER SERVICE DIV.         LUCCHESSI
SPIFFY COMPUTER SERVICE DIV.         O'CONNELL
・・・

(10行のみ表示)

```

次に、Oracle独自の「(+)」を使って同じことを行います。
シンプルになりました（が、標準SQLの書き方ではないです）。

```

SELECT DEPTNAME, LASTNAME FROM
  DEPARTMENT D, EMPLOYEE E
  WHERE D.DEPTNO = E.WORKDEPT (+)


DEPTNAME                             LASTNAME
------------------------------------ ---------------
SPIFFY COMPUTER SERVICE DIV.         HAAS
PLANNING                             THOMPSON
INFORMATION CENTER                   KWAN
SUPPORT SERVICES                     GEYER
MANUFACTURING SYSTEMS                STERN
ADMINISTRATION SYSTEMS               PULASKI
OPERATIONS                           HENDERSON
SOFTWARE SUPPORT                     SPENSER
SPIFFY COMPUTER SERVICE DIV.         LUCCHESSI
SPIFFY COMPUTER SERVICE DIV.         O'CONNELL
・・・

(10行のみ表示)

```




# 参考資料



- [DB2_COMPATIBILITY_VECTOR レジストリー変数](https://www.ibm.com/docs/ja/db2/11.5?topic=features-db2-compatibility-vector-registry-variable)
      
       

| ビット位置       |       16進値 |    説明    |
|:----------------------:|:-----------------------:|:------------------------------|
| 3             | 0x04 |このビットは以前、外部結合演算子のサポートをアクティブにしていました。そのフィーチャーは現在、常にアクティブであるため、このビットは無視されるようになりました。        |

Db2 11.1以降は、このビットをアクティブにする必要はなくなった（デフォルトで使用可能）であることが書かれています。
            
 	





#  [Db2 11.5 マニュアルのトップページ]
- 日本語
    - https://www.ibm.com/docs/ja/db2/11.5
- 英語
    - https://www.ibm.com/docs/en/db2/11.5
    - 最新情報は英語で更新されていますので英語で確認するのがお薦めです

# [Db2 11.5 システム要件]
稼働環境の前提要件等の確認はこちらでおこないます（英語）
- [System requirements for IBM Db2 for Linux, UNIX, and Windows](
https://www.ibm.com/support/pages/system-requirements-ibm-db2-linux-unix-and-windows)