4D v14

結合のサポート

ホーム

 
4D v14
結合のサポート

結合のサポート  


 

 

4DのSQLエンジンは結合のサポートを拡張します。

結合操作はINNERまたはOUTER、そして明示または暗黙です。暗黙のINNER結合はSELECTコマンドでサポートされます。さらにJOINキーワードを使用して生成される明示的なINNER結合とOUTER結合が使用できます。

Note: 4D SQLエンジンの結合の現在の実装には以下が含まれていません:

  • NATURAL結合
  • INNER結合のUSING構成

概要  

結合操作は2つ以上のテーブル間のレコードの接続を作成し、結果を結合と呼ばれる新しいテーブルに一体化させるために使用します。

結合条件を指定したSELECTステートメントを使用して結合を生成します。明示的な結合では、これらの条件を複合にすることができますが、常に結合に含まれる列間の等価比較に基づくものでなければなりません。例えば >= 演算子を明示的な結合条件に使用することはできません。暗黙的な結合ではすべてのタイプの比較を使用できます。
内部的に、等価比較は4Dエンジンにより直接実行されるので、素早く実行されます。

Note: 通常データベースエンジンでは、テーブルの順番は検索の間に指定された順番です。しかし結合を使用する際、テーブルの順番はテーブルリストで決定されます。以下の例題で:

SELECT * FROM T1 RIGHT OUTER JOIN T2 ON T2.depID = T1.depID;

テーブルの順番は (テーブルリストに現れる通り) T1そしてT2です。 (結合条件に現れる順である) T2そしてT1ではありません。

INNER結合は2つの列間で一致する値を探す比較に基づきます。例えば以下の3つのテーブルがあるとき:

  • Employees
    namedepIDcityID
    Alan1030
    Anne1139
    Bernard1033
    Mark1235
    Martin1530
    PhilipNULL33
    Thomas10NULL
  • Departments
    depIDdepName
    10Program
    11Engineering
    NULLMarketing
    12Development
    13Quality
  • Cities
    cityIDcityName
    30Paris
    33New York
    NULLBerlin

Note: この例のストラクチャはこのセクションを通して使用されます。

暗黙的なINNER結合の例は以下の通りです:

SELECT *  
        FROM employees, departments
        WHERE employees.DepID = departments.DepID;

4Dでは、JOINキーワードを使用して明示的なINNER結合を指定できます:

SELECT *
        FROM employees
        INNER JOIN departments
            ON employees.DepID = departments.DepID;

このクエリを以下のように4Dコードに挿入できます:

 ARRAY TEXT(aName;0)
 ARRAY TEXT(aDepName;0)
 ARRAY INTEGER(aEmpDepID;0
 ARRAY INTEGER(aDepID;0)
 Begin SQL
        SELECT *
        FROM employees
                INNER JOIN departments
                    ON employees.depID = departments.depID
                INTO :aName, :aEmpDepID, :aDepID, :aDepName;
 End SQL

この結合結果は以下のとおりとなります:

aNameaEmpDepIDaDepIDaDepName
Alan1010Program
Anne1111Engineering
Bernard1010Program
Mark1212Development
Thomas1010Program

従業員名がPhilipとMartin、また部署名がMarketingとQualityは結合の結果に現れません。なぜなら:

  • Philipに部署は割り当てられていません (NULL値)。
  • Martinの部署IDはDepartmentsテーブルに存在しません。
  • Quality部署に割り当てられた従業員はいません (ID 13)。
  • Marketing部署にIDが割り当てられていません (NULL値)。

CROSS結合あるいはデカルト積はWHEREON句も指定されていないINNER結合です。これはあるテーブルのそれぞれの行を他のテーブルのそれぞれの行に関連付けるものです。
CROSS結合の結果はテーブルのデカルト積であり、2つのテーブルの行数の積が総行数として含まれます。この積は両テーブルの行を結合した場合のすべての組み合わせを表します。

以下のシンタックスはすべて同等です:

    SELECT * FROM T1 INNER JOIN T2
    SELECT * FROM T1, T2
    SELECT * FROM T1 CROSS JOIN T2;

以下はCROSS結合を行う4Dコードの例です:

 ARRAY TEXT(aName;0)
 ARRAY TEXT(aDepName;0)
 ARRAY INTEGER(aEmpDepID;0
 ARRAY INTEGER(aDepID;0)
 Begin SQL
        SELECT *
        FROM employees CROSS JOIN departments
                INTO :aName, :aEmpDepID, :aDepID, :aDepName;
 End SQL

以下は例題データベースにおけるこの結合の結果です:

aNameaEmpDepIDaDepIDaDepName
Alan1010Program
Anne1110Program
Bernard1010Program
Mark1210Program
Martin1510Program
PhilipNULL10Program
Thomas1010Program
Alan1011Engineering
Anne1111Engineering
Bernard1011Engineering
Mark1211Engineering
Martin1511Engineering
PhilipNULL11Engineering
Thomas1011Engineering
Alan10NULLMarketing
Anne11NULLMarketing
Bernard10NULLMarketing
Mark12NULLMarketing
Martin15NULLMarketing
PhilipNULLNULLMarketing
Thomas10NULLMarketing
Alan1012Development
Anne1112Development
Bernard1012Development
Mark1212Development
Martin1512Development
PhilippeNULL12Development
Thomas1012Development
Alain1013Quality
Anne1113Quality
Bernard1013Quality
Mark1213Quality
Martin1513Quality
PhilipNULL13Quality
Thomas1013Quality

Note: パフォーマンスの理由から、CROSS結合は注意して使用しなければなりません。

4DでOUTER結合を生成できるようになりました。OUTER結合では、結合させるテーブルの行間で値が一致する必要はありません。結果のテーブルには、たとえ一致する行がなくても、テーブル (または少なくとも1つの結合されたテーブル)のすべての行が含まれます。 これは、たとえ異なる結合されたテーブル間でぎょうが完全に値を持っていない場合でも、あるテーブルのすべての情報が使用できることを意味します。

OUTER結合にはLEFTRIGHT、そしてFULLキーワードで指定される3つのタイプがあります。LEFTRIGHTは (JOIN キーワードの左あるいは右どちらに位置するかで) すべてのデータが処理されるテーブルを示すために使用されます。FULLは両側のOUTER結合を示します。

Note: 4Dでは明示的なOUTER結合だけがサポートされます。

LEFT OUTER結合 (またはLEFT結合) の結果には、たとえ結合条件に一致するレコードがキーワードの右側のテーブルにない場合でも、常にキーワードの左にあるテーブルのすべてのレコードが含まれます。これは検索が右側のテーブル内で一致する行を見つけることができない左テーブルの各行についても、結合はそれらを結果に含めることを意味します。しかしこの場合右テーブルの各列にはNULL値が入ります。言い換えればLEFT OUTER結合は左側のテーブルのすべての行と、結合条件に一致する右テーブルの行 (または一致しない場合NULL) を作成します。左テーブルの1つの行に対し、結合述部に一致する右テーブルの行が複数ある場合、左テーブルの値は右テーブルの各行に対し繰り返される点に留意してください。

以下はLEFT OUTER結合を行う4Dコードの例です:

 ARRAY TEXT(aName;0)
 ARRAY TEXT(aDepName;0)
 ARRAY INTEGER(aEmpDepID;0
 ARRAY INTEGER(aDepID;0)
 Begin SQL
        SELECT *
            FROM employees
            LEFT OUTER JOIN departments
                ON employees.DepID = departments.DepID;
                INTO :aName, :aEmpDepID, :aDepID, :aDepName;
 End SQL

以下は例題データベースでこの結合を実行したときの結果です (赤は追加の行を示します):

aNameaEmpDepIDaDepIDaDepName
Alan1010Program
Anne1111Engineering
Bernard1010Program
Mark1212Development
Thomas1010Program
Martin15NULLNULL
PhilipNULLNULLNULL

RIGHT OUTER結合は完全にLEFT OUTER結合の反対です (前の段落参照)。たとえ結合条件に一致するレコードが左のテーブルに見つからない場合でも、結果には常にJOINキーワードの右側のテーブルのすべてのレコードが含まれます。

以下はRIGHT OUTER結合を行う4Dコードの例です:

 ARRAY TEXT(aName;0)
 ARRAY TEXT(aDepName;0)
 ARRAY INTEGER(aEmpDepID;0
 ARRAY INTEGER(aDepID;0)
 Begin SQL
        SELECT *
            FROM employees
            RIGHT OUTER JOIN departments
                ON employees.DepID = departments.DepID;
                INTO :aName, :aEmpDepID, :aDepID, :aDepName;
 End SQL

以下は例題データベースでこの結合を実行したときの結果です (赤は追加の行を示します):

aNameaEmpDepIDaDepIDaDepName
Alan1010Program
Anne1111Engineering
Bernard1010Program
Mark1212Development
Thomas1010Program
NULLNULLNULLMarketing
NULLNULL13Quality

FULL OUTER結合は単純にLEFT OUTER結合とRIGHT OUTER結合の結果を組み合わせたものです。結果の結合テーブルには左および右のレコードがすべて含まれます。それぞれの側で失われたフィールドはNULL値になります。

以下はFULL OUTER結合を行う4Dコードの例です:

 ARRAY TEXT(aName;0)
 ARRAY TEXT(aDepName;0)
 ARRAY INTEGER(aEmpDepID;0
 ARRAY INTEGER(aDepID;0)
 Begin SQL
        SELECT *
            FROM employees
            FULL OUTER JOIN departments
                ON employees.DepID = departments.DepID;
                INTO :aName, :aEmpDepID, :aDepID, :aDepName;
 End SQL

以下は例題データベースでこの結合を実行したときの結果です (赤は追加の行を示します):

aNameaEmpDepIDaDepIDaDepName
Alan1010Program
Anne1111Engineering
Bernard1010Program
Mark1212Development
Thomas1010Program
Martin15NULLNULL
PhilipNULLNULLNULL
NULLNULLNULLMarketing
NULLNULL13Quality

1つのSELECTステートメント内で複数の結合を組み合わせることができます。また暗黙的または明示的なINNER結合と明示的なOUTER結合を組み合わせることもできます。

以下は複数の結合を行う4Dコードの例です:

 ARRAY TEXT(aName;0)
 ARRAY TEXT(aDepName;0)
 ARRAY TEXT(aCityName;0)
 ARRAY INTEGER(aEmpDepID;0
 ARRAY INTEGER(aEmpCityID;0)
 ARRAY INTEGER(aDepID;0)
 ARRAY INTEGER(aCityID;0)
 Begin SQL
        SELECT *
            FROM (employees RIGHT OUTER JOIN departments
                        ON employees.depID = departments.depID)
                        LEFT OUTER JOIN cities
                        ON employees.cityID = cities.cityID
            INTO :aName, :aEmpDepID, :aEmpCityID, :aDepID, :aDepName, :aCityID, :aCityName;
 End SQL

以下は例題データベースでこの結合を実行したときの結果です:

aNameaEmpDepIDaEmpCityIDaDepIDaDepNameaCityIDaCityName
Alan103010Program30Paris
Anne113911Engineering0    
Bernard103310Program33New York
Mark123512Development 0
Thomas10NULL10Program0   

 
プロパティ 

プロダクト: 4D
テーマ: 4DでSQLを使用する

 
ARTICLE USAGE

SQLリファレンス ( 4D v14)
SQLリファレンス ( 4D v12.1)
SQLリファレンス ( 4D v13.4)
SQLリファレンス ( 4D v14 R2)
SQLリファレンス ( 4D v14 R3)
SQLリファレンス ( 4D v14 R4)