4D v15

結合のサポート

ホーム

 
4D v15
結合のサポート

結合のサポート  


 

 

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

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

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

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

概要  

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

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

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

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

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

joinがどのようにして動作するかを説明するために、この章では以下のデータベースを使用することにします:

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

必要であれば、以下のコードを実行する事でこのデータベースを自動的に生成することができます:

 Begin SQL
         DROP TABLE IF EXISTS Employees;
         CREATE TABLE Employees ( depID INT32, name VARCHAR, cityID INT32);
         INSERT INTO Employees (name, depID, cityID) VALUES ('Alan', 10, 30);
         INSERT INTO Employees (name, depID, cityID) VALUES ('Anne', 11, 39);
         INSERT INTO Employees (name, depID, cityID) VALUES ('Bernard', 10, 33);
         INSERT INTO Employees (name, depID, cityID) VALUES ('Fabrice', 12, 35);
         INSERT INTO Employees (name, depID, cityID) VALUES ('Martin', 15, 30);
         INSERT INTO Employees (name, depID, cityID) VALUES ('Philip', NULL, 33);
         INSERT INTO Employees (name, depID, cityID) VALUES ('Thomas', 10, NULL);
 
         DROP TABLE IF EXISTS Departments;
         CREATE TABLE Departments ( depID INT32, depName VARCHAR );
         INSERT INTO Departments (depID, depName) VALUES (10, 'Program');
         INSERT INTO Departments (depID, depName) VALUES (11, 'Engineering');
         INSERT INTO Departments (depID, depName) VALUES (NULL, 'Marketing');
         INSERT INTO Departments (depID, depName) VALUES (12, 'Development');
         INSERT INTO Departments (depID, depName) VALUES (13, 'Quality');
 
         DROP TABLE IF EXISTS Cities;
         CREATE TABLE Cities ( cityID INT32, cityName VARCHAR );
         INSERT INTO Cities (cityID, cityName) VALUES (30, 'Paris');
         INSERT INTO Cities (cityID, cityName) VALUES (33, 'New York');
         INSERT INTO Cities (cityID, cityName) VALUES (NULL, 'Berlin');
 End SQL

INNER結合は2つの列間で一致する値を探す比較に基づきます。

以下は明示的な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 Employees.name, Employees.depID, Departments.depID, Departments.depName
        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という名前のemployeeはおらず、またMarketingあるいはQualityのDepartmentの人も含まれないという点に注意して下さい:

  • Philipという名前にはDepartmentが割り当てられていない(NULL値)
  • Martinに割り当てられたDepartment IDはDepartmentのテーブルに含まれていない
  • Quality Department(ID 13)に割り当てられているemployeeはいない
  • Marketing department にはIDが割り当てられていない(NULL値)

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 Employees.name, Employees.depID, Departments.depID, Departments.depName
            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 Employees.name, Employees.depID, Departments.depID, Departments.depName
            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 Employees.name, Employees.depID, Departments.depID, Departments.depName
            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

 
プロパティ 

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

 
履歴 

 
ARTICLE USAGE

SQLリファレンス ( 4D v15)