| 4D v14結合のサポート | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|  | 
    4D v14
 結合のサポート 
         | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| name | depID | cityID | 
| Alan | 10 | 30 | 
| Anne | 11 | 39 | 
| Bernard | 10 | 33 | 
| Mark | 12 | 35 | 
| Martin | 15 | 30 | 
| Philip | NULL | 33 | 
| Thomas | 10 | NULL | 
| depID | depName | 
| 10 | Program | 
| 11 | Engineering | 
| NULL | Marketing | 
| 12 | Development | 
| 13 | Quality | 
| cityID | cityName | 
| 30 | Paris | 
| 33 | New York | 
| NULL | Berlin | 
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この結合結果は以下のとおりとなります:
| aName | aEmpDepID | aDepID | aDepName | 
| Alan | 10 | 10 | Program | 
| Anne | 11 | 11 | Engineering | 
| Bernard | 10 | 10 | Program | 
| Mark | 12 | 12 | Development | 
| Thomas | 10 | 10 | Program | 
従業員名がPhilipとMartin、また部署名がMarketingとQualityは結合の結果に現れません。なぜなら:
CROSS結合あるいはデカルト積はWHEREもON句も指定されていない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以下は例題データベースにおけるこの結合の結果です:
| aName | aEmpDepID | aDepID | aDepName | 
| Alan | 10 | 10 | Program | 
| Anne | 11 | 10 | Program | 
| Bernard | 10 | 10 | Program | 
| Mark | 12 | 10 | Program | 
| Martin | 15 | 10 | Program | 
| Philip | NULL | 10 | Program | 
| Thomas | 10 | 10 | Program | 
| Alan | 10 | 11 | Engineering | 
| Anne | 11 | 11 | Engineering | 
| Bernard | 10 | 11 | Engineering | 
| Mark | 12 | 11 | Engineering | 
| Martin | 15 | 11 | Engineering | 
| Philip | NULL | 11 | Engineering | 
| Thomas | 10 | 11 | Engineering | 
| Alan | 10 | NULL | Marketing | 
| Anne | 11 | NULL | Marketing | 
| Bernard | 10 | NULL | Marketing | 
| Mark | 12 | NULL | Marketing | 
| Martin | 15 | NULL | Marketing | 
| Philip | NULL | NULL | Marketing | 
| Thomas | 10 | NULL | Marketing | 
| Alan | 10 | 12 | Development | 
| Anne | 11 | 12 | Development | 
| Bernard | 10 | 12 | Development | 
| Mark | 12 | 12 | Development | 
| Martin | 15 | 12 | Development | 
| Philippe | NULL | 12 | Development | 
| Thomas | 10 | 12 | Development | 
| Alain | 10 | 13 | Quality | 
| Anne | 11 | 13 | Quality | 
| Bernard | 10 | 13 | Quality | 
| Mark | 12 | 13 | Quality | 
| Martin | 15 | 13 | Quality | 
| Philip | NULL | 13 | Quality | 
| Thomas | 10 | 13 | Quality | 
Note: パフォーマンスの理由から、CROSS結合は注意して使用しなければなりません。
4DでOUTER結合を生成できるようになりました。OUTER結合では、結合させるテーブルの行間で値が一致する必要はありません。結果のテーブルには、たとえ一致する行がなくても、テーブル (または少なくとも1つの結合されたテーブル)のすべての行が含まれます。 これは、たとえ異なる結合されたテーブル間でぎょうが完全に値を持っていない場合でも、あるテーブルのすべての情報が使用できることを意味します。
OUTER結合にはLEFT、RIGHT、そしてFULLキーワードで指定される3つのタイプがあります。LEFTとRIGHTは (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以下は例題データベースでこの結合を実行したときの結果です (赤は追加の行を示します):
| aName | aEmpDepID | aDepID | aDepName | 
| Alan | 10 | 10 | Program | 
| Anne | 11 | 11 | Engineering | 
| Bernard | 10 | 10 | Program | 
| Mark | 12 | 12 | Development | 
| Thomas | 10 | 10 | Program | 
| Martin | 15 | NULL | NULL | 
| Philip | NULL | NULL | NULL | 
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以下は例題データベースでこの結合を実行したときの結果です (赤は追加の行を示します):
| aName | aEmpDepID | aDepID | aDepName | 
| Alan | 10 | 10 | Program | 
| Anne | 11 | 11 | Engineering | 
| Bernard | 10 | 10 | Program | 
| Mark | 12 | 12 | Development | 
| Thomas | 10 | 10 | Program | 
| NULL | NULL | NULL | Marketing | 
| NULL | NULL | 13 | Quality | 
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以下は例題データベースでこの結合を実行したときの結果です (赤は追加の行を示します):
| aName | aEmpDepID | aDepID | aDepName | 
| Alan | 10 | 10 | Program | 
| Anne | 11 | 11 | Engineering | 
| Bernard | 10 | 10 | Program | 
| Mark | 12 | 12 | Development | 
| Thomas | 10 | 10 | Program | 
| Martin | 15 | NULL | NULL | 
| Philip | NULL | NULL | NULL | 
| NULL | NULL | NULL | Marketing | 
| NULL | NULL | 13 | Quality | 
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以下は例題データベースでこの結合を実行したときの結果です:
| aName | aEmpDepID | aEmpCityID | aDepID | aDepName | aCityID | aCityName | 
| Alan | 10 | 30 | 10 | Program | 30 | Paris | 
| Anne | 11 | 39 | 11 | Engineering | 0 | |
| Bernard | 10 | 33 | 10 | Program | 33 | New York | 
| Mark | 12 | 35 | 12 | Development | 0 | |
| Thomas | 10 | NULL | 10 | Program | 0 | 
	プロダクト: 4D
	テーマ: 4DでSQLを使用する
	
        
        
	
	SQLリファレンス ( 4D v14)
	SQLリファレンス ( 4D v12.1)
	SQLリファレンス ( 4D v13.4)
	SQLリファレンス ( 4D v14 R2)
	SQLリファレンス ( 4D v14 R3)
	SQLリファレンス ( 4D v14 R4)