Skip to main content

This documentation is for an older version of this product. See the latest version of this content.Opens in a new tab

JOIN (SQL)

2 つのテーブルのデータを基にテーブルを作成する SELECT 従属節です。

Synopsis

INNER JOIN

SELECT ... FROM table1 INNER JOIN table2 ON condition
SELECT ... FROM table1 INNER JOIN table2 USING (column, column2, ...)
SELECT ... FROM table1 JOIN table2 ...

SELECT ... FROM table1 NATURAL INNER JOIN table2
SELECT ... FROM table1 NATURAL JOIN table2
LEFT OUTER JOIN

SELECT ... FROM table1 LEFT OUTER JOIN table2 ON condition
SELECT ... FROM table1 LEFT OUTER JOIN table2 USING (column, column2, ...)
SELECT ... FROM table1 LEFT JOIN table2 ...

SELECT ... FROM table1 NATURAL LEFT OUTER JOIN table2
SELECT ... FROM table1 NATURAL LEFT JOIN table2
RIGHT OUTER JOIN

SELECT ... FROM table1 RIGHT OUTER JOIN table2 ON condition
SELECT ... FROM table1 RIGHT OUTER JOIN table2 USING (column, column2, ...)
SELECT ... FROM table1 RIGHT JOIN table2 ...

SELECT ... FROM table1 NATURAL RIGHT OUTER JOIN table2
SELECT ... FROM table1 NATURAL RIGHT JOIN table2
FULL OUTER JOIN

SELECT ... FROM table1 FULL OUTER JOIN table2 ON condition
SELECT ... FROM table1 FULL JOIN table2 ON condition
CROSS JOIN

SELECT ... FROM table1 CROSS JOIN table2

概要

JOIN 操作は、2 つのテーブルの一致する行を 1 つのテーブルに結合します。2 つのテーブルにまたがる行は、指定された 1 つ以上の列に同じ値がある場合、一致と見なされます。結合されたテーブルで返される行をさらに制限するには、追加の制限を指定します。

結合を使用して、テーブル間で関連するデータをリンクするレポートとクエリを生成します。SELECT クエリで、FROM 節の一部として JOIN 操作を指定します。クエリ内では、複数の内部結合および外部結合を任意の順序で指定できます。

INNER JOIN

INNER JOIN は、最初のテーブルと 2 番目のテーブルの一致する行を返します。以下に例を示します。

SELECT Table1.Letter, Table2.Number
FROM Table1
INNER JOIN Table2
ON Table1.ID = Table2.ID

Left: Table1 - ID:1-2-3, Letter:A-B-C. (right) Right: Table2 - ID:3-4-5, Number:3-4-5. Center: INNER JOIN - Letter:C, Number:

  • SELECT ... FROM table1 INNER JOIN table2 ON condition は、ON 節で指定された条件式に一致する table1table2 の行を返します。ON 節は、結合式内の任意の場所に指定できます。

    このクエリは、Sample.Employee テーブル (E というエイリアス) と Sample.Company テーブル (C というエイリアス) のデータを結合し、従業員の名前とその会社を返します。両方のテーブルの CompanyID 列の値が一致している行についてのみ、E.NameC.Name の値を返します。

    SELECT E.Name, C.Name
    FROM Sample.Employee AS E
    INNER JOIN Sample.Company AS C
    ON E.CompanyID = C.CompanyID

    このクエリでは、さらに 20 歳を超える従業員の列のみを返すことで、データを制限しています。

    SELECT E.Name, C.Name
    FROM Sample.Employee AS E
    INNER JOIN Sample.Company AS C
    ON E.CompanyID = C.CompanyID AND E.Age > 20

    例 : 内部結合と外部結合を使用したテーブル・データの結合

  • SELECT ... FROM table1 INNER JOIN table2 USING (column, column2, ...) は、指定された列の値に一致する、table1table2 の行を返します。USING 節で指定される列は、両方のテーブルに存在する必要があります。この構文を使用することで、リンクされている列が両方のテーブルで同じ名前を持っている場合に、ON 構文より簡潔に等値条件が表されます。マルチ結合クエリでは、最初の結合に対してのみ USING 節を指定できます。

    このクエリは、両方の列に結合できる CompanyID 列があるため、前の構文と同じ結合を実行します。

    SELECT E.Name, C.Name
    FROM Sample.Employee AS E
    INNER JOIN Sample.Company AS C
    USING (CompanyID)

    例 : 2 つのテーブル間で同一の名前を持つ列での結合

  • SELECT ... FROM table1 JOIN table2 ... は、前の INNER JOIN 構文と等価です。

  • SELECT ... FROM table1 NATURAL INNER JOIN table2 は、2 つのテーブル間で同一の名前を持つすべての列に対して INNER JOIN を実行します。マルチ結合クエリでは、1 つの NATURAL 結合のみを指定でき、これが最初の結合である必要があります。

    CompanyID が両方のテーブルに出現する唯一の列とすると、このクエリは、前の構文と同じ操作を実行します。これらのテーブルに同じ名前の列が複数含まれる場合、クエリは、マッチング結果を返す前に、これらの列も結合します。

    SELECT E.Name, C.Name
    FROM Sample.Employee AS E
    NATURAL INNER JOIN Sample.Company AS C
    

    例 : 2 つのテーブル間で同一の名前を持つ列での結合

  • SELECT ... FROM table1 NATURAL JOIN table2 は、NATURAL INNER JOIN 構文と等価です。

LEFT OUTER JOIN

LEFT OUTER JOIN は、最初のテーブルのすべての行と、最初のテーブルの行と一致する 2 番目のテーブルの行を返します。結合されたテーブルでは、2 番目のテーブルからの列の一致しない行には、NULL 値が移入されます。以下に例を示します。

SELECT Table1.Letter, Table2.Number
FROM Table1
LEFT OUTER JOIN Table2
ON Table1.ID = Table2.ID

Left: Table1 - ID:1-2-3, Letter:A-B-C. Table2 - ID:3-4-5, Number:3-4-5. Center: Join - Letter:A-B-C, Number:null-null-3

  • SELECT ... FROM table1 LEFT OUTER JOIN table2 ON condition は、table1 のすべての行を返し、これらを、ON 節で指定された条件式を満たす table2 の行と結合します。

    このクエリは、Sample.Employee テーブル (E というエイリアス) と Sample.Company テーブル (C というエイリアス) のデータを結合し、従業員の名前とその会社を返します。これは、すべての E.Name 値を返しますが、C.Name 値については、両方の CompanyID 列の値が一致している行についてのみ返します。一致しない行については、C.Name 値は NULL に設定されます。

    SELECT E.Name, C.Name
    FROM Sample.Employee AS E
    LEFT OUTER JOIN Sample.Company AS C
    ON E.CompanyID = C.CompanyID
    Note:

    あるいは、明示的な LEFT OUTER JOIN 構文を使用するのではなく、SELECT 文内の矢印構文 (–>) で指定されるより簡潔な暗黙結合を使用することもできます。例えば、以下のクエリは前のクエリと同等です。

    SELECT Name, CompanyID->Name
    FROM Sample.Employee

    この構文は、Sample.EmployeeCompanyID 列が、結合される Name 列を含む Sample.Company テーブルの行の ID を参照することを前提としています。暗黙結合の操作の詳細は、"暗黙結合" を参照してください。

    例 :

  • SELECT ... FROM table1 LEFT OUTER JOIN table2 USING (column, column2, ...) は、table1 のすべての行と、指定された列の値に一致する、table2 の行を返します。列は両方のテーブルに存在する必要があります。

    このクエリは、両方の列に結合できる CompanyID 列があるため、前の構文と同じ結合を実行します。

    SELECT E.Name, C.Name
    FROM Sample.Employee AS E
    LEFT OUTER JOIN Sample.Company AS C
    USING (CompanyID)

    例 : 2 つのテーブル間で同一の名前を持つ列での結合

  • SELECT ... FROM table1 LEFT JOIN table2 ... は、LEFT OUTER JOIN 構文と等価です。

  • SELECT ... FROM table1 NATURAL LEFT OUTER JOIN table2 は、2 つのテーブル間で同一の名前を持つすべての列に対して LEFT OUTER JOIN を実行します。式に複数の結合が含まれる場合は、最初に NATURAL 結合を指定します。NATURAL 結合では、同じ名前を持つ列はマージされません。

    CompanyID が両方のテーブルに出現する唯一の列とすると、このクエリは、前の構文と同じ操作を実行します。テーブルに同一の名前を持つ列が複数含まれる場合、クエリは列ごとに追加の結合を実行します。

    SELECT E.Name, C.Name
    FROM Sample.Employee AS E
    NATURAL LEFT OUTER JOIN Sample.Company AS C
    

    例 : 2 つのテーブル間で同一の名前を持つ列での結合

  • SELECT ... FROM table1 NATURAL LEFT JOIN table2 は、NATURAL LEFT OUTER JOIN 構文と等価です。

RIGHT OUTER JOIN

RIGHT OUTER JOIN は、2 番目のテーブルのすべての行と、2 番目のテーブルの行と一致する最初のテーブルの行を返します。結合されたテーブルでは、最初のテーブルからの列の一致しない行には、NULL 値が移入されます。以下に例を示します。

SELECT Table1.Letter, Table2.Number
FROM Table1
RIGHT OUTER JOIN Table2
ON Table1.ID = Table2.ID

Left: Table1 - ID:1-2-3, Letter:A-B-C. Table2 - ID:3-4-5, Number:3-4-5. Center: Join - Letter:null-null-C, Number:3-4-5

  • SELECT ... FROM table1 RIGHT OUTER JOIN table2 ON condition は、table2 のすべての行を返し、これらを、ON 節で指定された条件式を満たす table1 の行と結合します。

    このクエリは、Sample.Employee テーブル (E というエイリアス) と Sample.Company テーブル (C というエイリアス) のデータを結合し、従業員の名前とその会社を返します。これは、すべての C.Name 値を返しますが、E.Name 値については、両方の CompanyID 列の値が一致している行についてのみ返します。一致しない行については、E.Name 値は NULL に設定されます。

    SELECT E.Name, C.Name
    FROM Sample.Employee AS E
    LEFT OUTER JOIN Sample.Company AS C
    ON E.CompanyID = C.CompanyID

    例 :

  • SELECT ... FROM table1 RIGHT OUTER JOIN table2 USING (column, column2, ...) は、table2 のすべての行と、指定された列の値に一致する、table1 の行を返します。列は両方のテーブルに存在する必要があります。

    このクエリは、両方の列に結合できる CompanyID 列があるため、前の構文と同じ結合を実行します。

    SELECT E.Name, C.Name
    FROM Sample.Employee AS E
    RIGHT OUTER JOIN Sample.Company AS C
    USING (CompanyID)

    例 : 2 つのテーブル間で同一の名前を持つ列での結合

  • SELECT ... FROM table1 RIGHT JOIN table2 ... は、RIGHT OUTER JOIN 構文と等価です。

  • SELECT ... FROM table1 NATURAL RIGHT OUTER JOIN table2 は、2 つのテーブル間で同一の名前を持つすべての列に対して RIGHT OUTER JOIN を実行します。式に複数の結合が含まれる場合は、最初に NATURAL 結合を指定します。NATURAL 結合では、同じ名前を持つ列はマージされません。

    CompanyID が両方のテーブルに出現する唯一の列とすると、このクエリは、前の構文と同じ操作を実行します。テーブルに同一の名前を持つ列が複数含まれる場合、クエリは列ごとに 1 つの結合を実行します。

    SELECT E.Name, C.Name
    FROM Sample.Employee AS E
    NATURAL RIGHT OUTER JOIN Sample.Company AS C
    

    例 : 2 つのテーブル間で同一の名前を持つ列での結合

  • SELECT ... FROM table1 NATURAL RIGHT JOIN table2 は、NATURAL RIGHT OUTER JOIN 構文と等価です。

FULL OUTER JOIN

FULL OUTER JOIN は、両方のテーブルのすべての行を結合します。結合されたテーブルでは、いずれかのテーブルからの列の一致しない行には、NULL 値が移入されます。以下に例を示します。

SELECT Table1.Letter, Table2.Number
FROM Table1
FULL OUTER JOIN Table2
ON Table1.ID = Table2.ID

Left: Table1-ID:1-2-3, Letter:A-B-C. Table2-ID:3-4-5, Number:3-4-5. Center: Join-Letter:A-B-C-null-null, Number:null-null-3-4

  • SELECT ... FROM table1 FULL OUTER JOIN table2 ON condition は、指定した condition に一致する table1 および table2 のすべての行を返します。

    このクエリは、人の名前とその勤務先の会社名を返します。Sample.PersonSample.Company のデータが結合されます。それぞれの行について、PersonID で指定された人に Company 列か Person 列のいずれかが欠落している場合、その列値は NULL になります。

    SELECT P.Name, E.Company
    FROM Sample.Person AS P
    INNER JOIN Sample.Employee AS E
    ON P.PersonID = E.PersonID

    例 : 内部結合と外部結合を使用したテーブル・データの結合

  • SELECT ... FROM table1 FULL JOIN table2 ON condition は、FULL OUTER JOIN 構文と等価です。

FULL OUTER JOIN では、USING および NATURAL 構文をサポートしていません。

CROSS JOIN

CROSS JOIN は最初のテーブルのすべての行を 2 番目のテーブルのすべての行と交差させます。以下に例を示します。

SELECT Table1.Letter, Table2.Number
FROM Table1
CROSS JOIN Table2

Left: Table1 - ID:1-2, Letter:A-B. Table2 - ID:1-2, Number:1-2. Center: Join -Letter:A-A-B-B, Number:1-2-1-2

  • SELECT ... FROM table1 CROSS JOIN table2 は、table1 のすべての行と table2 のすべての行を交差させ、多くのデータの重複を含む、大規模で論理的に包括的なテーブルを生成します。通常、この結合はコンマで区切られたテーブルのリストを FROM 節内で指定し、その後 WHERE 節を使用して制限条件を指定することによって実行されます。

    このクエリは、Sample.LettersAtoZ および Sample.Numbers1to10 内の行の各組み合わせの行を返します。

    SELECT * FROM Sample.LettersAtoZ CROSS JOIN Sample.Numbers1to10
    

    以下のクエリは前のクエリと同等です。

    SELECT * FROM Sample.LettersAtoZ, Sample.Numbers1to10

ローカル・テーブルと、ODBC または JDBC ゲートウェイ接続を介してリンクされた外部テーブル (FROM Sample.Person、Mylink.Person など) が関与する交差結合を実行しようとすると、SQLCODE -161 エラーが発生します。この交差結合を実行するには、リンクされるテーブルをサブクエリとして指定する必要があります (例 : FROM Sample.Person,(SELECT * FROM Mylink.Person))。

JOIN キーワードの明示的な使用は、コンマ構文を使用した交差結合の指定より優先されます。したがって、InterSystems IRIS® では t1,t2 JOIN t3t1,(t2 JOIN t3) と解釈されます。

引数

table1、table2

結合されるテーブルの名前。FROM キーワードの後に、最初のテーブル table1 を指定します。JOIN キーワードの後に、2 番目のテーブル table2 を指定します。

  • ON 節のある JOIN では、JOIN のどちらのオペランドにも、テーブル、ビュー、またはサブクエリを指定できます。

  • NATURAL 結合または USING 結合では、結合のいずれかのオペランドに、単純なベース・テーブル参照のみ (ビューやサブクエリではない) を指定できます。

table1table2 は、どちらもテーブル・エイリアスをサポートしています。

condition

結合される行を制限するために ON 節で指定される、1 つ以上の条件式の述語。JOIN では、InterSystems SQL でサポートされている述語のほとんどがサポートされます。ただし、FOR SOME %ELEMENT コレクション述語を使用して結合操作を制限することはできません。

AND、OR、および NOT 論理演算子を使用して、複数の条件式を関連付けることができます。AND は OR よりも優先します。条件式を入れ子にしたり、グループ化するには、括弧を使用します。以下に例を示します。

SELECT Patient.PName, Doctor.DName
FROM Patient
INNER JOIN Doctor
ON Patient.DocID = Doctor.DocID AND
   NOT (Doctor.State = 'NH' OR Doctor.State = 'MA')

condition には以下の制限事項があります。

  • condition は、ANSI キーワードの JOIN 操作で明示的に指定されたテーブルのみを参照できます。FROM 節で指定されたテーブルを参照すると、SQLCODE -23 エラーが発生します。

  • condition は、JOIN のオペランドに含まれる列のみを参照できます。複数の結合における構文優先順位が原因となって、ON 節が失敗する可能性があります。例えば、以下のクエリは、t1 と t3 が結合のオペランドでないため失敗します。t1 は、t2 JOIN t3 の結果セットと結合します。

    SELECT * FROM t1,t2 JOIN t3 ON t1.p1=t3.p3

    構文を以下のように変更すると、このクエリの実行は成功します。

    SELECT * FROM t1 CROSS JOIN t2 JOIN t3 ON t1.p1=t3.p3
    SELECT * FROM t2,t1 JOIN t3 ON t1.p1=t3.p3
  • OUTER JOIN 節では、テーブルに影響を与えるすべての条件で NULL 値を渡す可能性がある比較を使用しており、テーブル自体が外部結合のターゲットである場合、SQLCODE -94 エラーが発生する可能性があります。例えば、以下の LEFT OUTER JOIN クエリは無効です。

    SELECT * FROM Table1
    LEFT OUTER JOIN Table2 ON Table1.k = Table2.k
    LEFT OUTER JOIN Table3 ON COALESCE(Table1.k,Table2.k) = Table3.k

    FULL OUTER JOIN または RIGHT OUTER JOIN を使用した同様の例にも、この制限があります。

column

両方のテーブルで名前が同じ列を結合するために USING 節で指定される、列名、または列名のコンマ区切りリスト。列リストは括弧で囲みます。明示的な列名のみ使用できます。自動生成された RowID 列を参照する %ID 行を指定することはできません。重複する列名は無視されます。同じ名前の列はマージされません。

内部結合と外部結合を使用したテーブル・データの結合

この例では、2 つのサンプル・テーブルを作成し、異なる INNER JOIN, LEFT OUTER JOIN、および RIGHT OUTER JOIN 構文を使用してそのデータを 1 つのテーブルに結合し、異なる結合結果を比較します。

テーブルの作成

この例では以下の 2 つのテーブルを使用します。

  • Sample.HighestPeaks — 世界で最も高い山の標高 (フィート単位)。

  • Sample.Himalayas — ヒマラヤの山の名前。

この例では指定されていませんが、両方のテーブルの MountainID 列と PeakID 列は、より大規模な山のデータベースへの外部キー参照であるとします。したがって、両方のテーブルで同じ ID 列値の行は同じ山を参照します。

Sample.HighestPeaks テーブルを作成し、3 つのデータ行を挿入します。テーブルを表示します。

CREATE TABLE Sample.HighestPeaks (
  PeakID INTEGER UNIQUE NOT NULL,
  Elevation INTEGER NOT NULL)
INSERT INTO Sample.HighestPeaks VALUES (1, 29032)
INSERT INTO Sample.HighestPeaks VALUES (2, 28251)
INSERT INTO Sample.HighestPeaks VALUES (3, 28169)
SELECT * FROM Sample.HighestPeaks
PeakID Elevation
1 29032
2 28251
3 28169

Sample.Himalayas テーブルを作成し、3 つのデータ行を挿入します。MountainID の 2 は、意図的に省略されています。ID 2 の山はヒマラヤにはないものとします。テーブルを表示します。

CREATE TABLE Sample.Himalayas (
  MountainID INTEGER UNIQUE NOT NULL,
  Name VARCHAR(30) UNIQUE NOT NULL)
INSERT INTO Sample.Himalayas VALUES (1, 'Everest')
INSERT INTO Sample.Himalayas VALUES (3, 'Kangchenjunga')
INSERT INTO Sample.Himalayas VALUES (4, 'Lhotse')
SELECT * FROM Sample.Himalayas
MountainID Name
1 Everest
3 Kangchenjunga
4 Lhotse

INNER JOIN の実行

INNER JOIN を使用して 2 つのテーブルの山の名前と標高のデータを結合します。これらは、MountainID 列と PeakID 列で結合します。結合されたテーブルには、両方のテーブルに ID が存在する ID 1 と ID 3 の山のデータのみが含まれます。

SELECT H.Name, P.Elevation
FROM Sample.Himalayas AS H
INNER JOIN Sample.HighestPeaks as P
ON H.MountainID = P.PeakID
Name Elevation
Everest 29032
Kangchenjunga 28169

LEFT OUTER JOIN の実行

LEFT OUTER JOIN を使用して山の名前と標高のデータを結合します。これらは、MountainID 列と PeakID 列で結合します。結合されたテーブルには、最初のテーブル (Sample.Himalayas) のすべての行が含まれますが、2 番目のテーブル (Sample.HighestPeaks) については、PeakID 値が 1 と 3 の行のみ (これらは最初のテーブルの MountainID 列にも存在しているため) が含まれます。欠落している Lhotse 山の標高は、NULL 値を取ります。

SELECT H.Name, P.Elevation
FROM Sample.Himalayas AS H
LEFT OUTER JOIN Sample.HighestPeaks as P
ON H.MountainID = P.PeakID
Name Elevation
Everest 29032
Kangchenjunga 28169
Lhotse  

RIGHT OUTER JOIN の実行

RIGHT OUTER JOIN を使用して山の名前と標高のデータを結合します。これらは、MountainID 列と PeakID 列で結合します。結合されたテーブルには、2 番目のテーブル (Sample.HighestPeaks) のすべての行が含まれますが、最初のテーブル (Sample.Himalayas) については、MountainID 値が 1 と 3 の行のみ (これらは 2 番目のテーブルの PeakID 列にも存在しているため) が含まれます。欠落している 28,251 フィートの標高の山の名前は、NULL 値を取ります。

SELECT H.Name, P.Elevation
FROM Sample.Himalayas AS H
RIGHT OUTER JOIN Sample.HighestPeaks as P
ON H.MountainID = P.PeakID
Name Elevation
Everest 29032
  28251
Kangchenjunga 28169

FULL OUTER JOIN の実行

FULL OUTER JOIN を使用して山の名前と標高のデータを結合します。これらは、MountainID 列と PeakID 列で結合します。結合されたテーブルには、両方のテーブルのすべての行が含まれます。欠落している山の名前と標高は NULL 値を取ります。

SELECT H.Name, P.Elevation
FROM Sample.Himalayas AS H
FULL OUTER JOIN Sample.HighestPeaks as P
ON H.MountainID = P.PeakID
Name Elevation
Everest 29032
Kangchenjunga 28169
Lhotse  
  28251

テーブルの削除

完了したら、サンプル・テーブルを削除します。

DROP TABLE Sample.Himalayas
DROP TABLE Sample.HighestPeaks

2 つのテーブル間で同一の名前を持つ列での結合

次の例では、2 つのテーブル間で同一の名前を持つ列を結合する際に使用できるさまざまな構文を示します。

以下の 2 つのテーブルについて考えます。

  • Patient — 患者に関する情報 (患者のかかりつけ医の ID コード (DocID) など) が含まれます。

  • Doctor — 医師に関する情報 (医師のID コード (DocID) など) が含まれます。

以下の INNER JOIN は患者名と医師名を返します。

SELECT Patient.PName, Doctor.DName
FROM Patient
INNER JOIN Doctor
ON Patient.DocID = Doctor.DocID

結合する列は、両方のテーブルで同じ名前 (DocID) を持つため、ON 節を USING 節に置き換えることができます。以下の構文では、括弧で囲んで列のみを指定し、テーブル名は省略します。

SELECT Patient.PName, Doctor.DName
FROM Patient
INNER JOIN Doctor
USING (DocID)

USING 節を LEFT OUTER JOIN または RIGHT OUTER JOIN で指定することもできますが、FULL OUTER JOIN はサポートされていません。

SELECT Patient.PName, Doctor.DName
FROM Patient
RIGHT OUTER JOIN Doctor
USING (DocID)
SELECT Patient.PName, Doctor.DName
FROM Patient
LEFT OUTER JOIN Doctor
USING (DocID)

DocID が 2 つのテーブル間で同じ名前を持つ唯一の列である場合は、さらに単純化して NATURAL JOIN 構文を使用できます。

SELECT Patient.PName, Doctor.DName
FROM Patient
NATURAL INNER JOIN Doctor
SELECT Patient.PName, Doctor.DName
FROM Patient
NATURAL LEFT OUTER JOIN Doctor
SELECT Patient.PName, Doctor.DName
FROM Patient
NATURAL RIGHT OUTER JOIN Doctor

2 つのテーブルに他に同一の列が含まれている場合、NATURAL JOIN は、結合操作でこれらの列もリンクさせます。結合する列をより詳細に指定するには、USING 節または ON 節を使用します。FULL OUTER JOIN では、NATURAL JOINをサポートしていません。

結合データに対する追加の制限の設定

この例では、追加の制限の設定により、さまざまな結合で返されるデータがどのように影響を受けるかを示します。

以下の 2 つのテーブルについて考えます。

  • Patient — 患者に関する情報 (患者のかかりつけ医の ID コード (DocID) など) が含まれます。

  • Doctor — 医師に関する情報 (医師のID コード (DocID) など) が含まれます。

以下の INNER JOIN は 45 歳を超える医師の患者名とその医師名を返します。

SELECT Patient.PName, Doctor.DName
FROM Patient
INNER JOIN Doctor
ON Patient.DocID = Doctor.DocID AND Doctors.Age > 45

同じクエリの LEFT OUTER JOIN を実行しても、結合されるテーブルの一致しない行の NULL 値は排除されません。例えば、この LEFT OUTER JOIN は、依然として Doctor.DName 列に NULL 値を返します。

SELECT Patient.PName, Doctor.DName
FROM Patient
LEFT OUTER JOIN Doctor
ON Patient.DocID = Doctor.DocID AND Doctors.Age > 45

NULL 値を排除するには、年齢条件を WHERE 節に移動し、結合操作後にここで処理します。ただし、これによってクエリは効果的に INNER JOIN に変換されます。例えば、以下のクエリはこの例の最初のクエリと同等です。

SELECT Patient.PName, Doctor.DName
FROM Patient
LEFT OUTER JOIN Doctor
ON Patient.DocID = Doctor.DocID
WHERE Doctors.Age > 45

IS NULL 節を追加すると、元の LEFT OUTER JOIN の動作は保持されますが、元の LEFT OUTER JOIN クエリより冗長になります。

SELECT Patient.PName, Doctor.DName
FROM Patient
LEFT OUTER JOIN Doctor
ON Patient.DocID = Doctor.DocID
WHERE Doctors.Age > 45 AND Doctors.Age IS NULL

この動作は、RIGHT OUTER JOIN 操作でも同様です。FULL OUTER JOIN では、一致に関係なく、両方のテーブルのすべての行が返されるため、条件を指定しても返される行には影響しません。

パフォーマンス

クエリ・オプティマイザの結合に対する影響

結合操作のパフォーマンスを最大にするため、SQL オプティマイザは指定された順序でテーブルを結合しない場合があります。代わりに、オプティマイザは、テーブルのチューニングなど、テーブルで収集される統計に基づいてテーブルの結合順序を決定します。

ほとんどの場合、SQL オプティマイザの最適化方法で最適な結果が得られます。ただし、特定のクエリに対して、既定の最適化方法をオーバーライドするため、FROM キーワードの直後にクエリ最適化オプションを指定することができます。

  • %INORDER、%FIRSTTABLE、および %STARTTABLE — 複数の結合が含まれる複雑なクエリでは、これらのオプションで明示的に結合するテーブルの順序を設定します。これらのキーワードは、CROSS JOIN や RIGHT OUTER JOIN では使用できません。使用しようとすると SQLCODE -34 エラーが発生します。

  • %NOFLATTEN — このオプションは、特定のサブクエリを明示的な結合に変換するサブクエリの平坦化を無効にします。サブクエリの数が少ない場合、サブクエリの平坦化により結合パフォーマンスが大幅に向上することがあります。ただし、サブクエリの数が増加すると、サブクエリの平坦化のパフォーマンスは低下し始め、このキーワードを使用して無効にする必要が生じる場合があります。

ON 節のインデックス作成

結合の ON 節で参照される列にインデックスを指定すると、クエリのパフォーマンスが大幅に向上します。ON 節では、いくつかの結合条件のみを満たす既存のインデックスを使用できます。複数の列に対して条件を指定する ON 節は、添え字としてこれらの列のサブセットのみを含むインデックスを使用して、結合を部分的に満たすことができます。InterSystems IRIS は、直接テーブルの残りの列に対して結合条件をテストします。

ON 節で参照されているフィールドの照合タイプは、対応するインデックス内でのそのフィールドの照合タイプと一致する必要があります。照合タイプが一致していない場合は、インデックスは使用されない可能性があります。ただし、結合条件が %EXACT 照合を持つ列に存在しており、照合された列値のインデックスのみ使用可能な場合、InterSystems IRIS はそのインデックスを使用して、正確な値であるかどうか確認する行を制限できます。照合タイプのマッチングの詳細は、"インデックス照合" を参照してください。

ON 節の条件のインデックスを無効にするには、この先頭に %NOINDEX キーワードを付けます。インデックスとパフォーマンスの詳細は、"クエリ処理でのインデックスの使用" および "インデックスの最適化オプション" を参照してください。

代替案

InterSystems IRIS には、外部結合の表示に 2 種類の形式があります。

  1. (推奨) ANSI 標準構文の LEFT OUTER JOIN と RIGHT OUTER JOIN。以下の例で示しているように、SQL 標準構文は WHERE 節ではなく、SELECT 文の FROM 節で外部結合を入力します。

    SELECT table1.columnA, table2.columnB
    FROM table1
    LEFT OUTER JOIN table2
    ON (table1.columnX = table2.columnY)
    
  2. エスケープ構文 {oj joinExpression } を使用する、ODBC 仕様外部結合拡張構文 (joinExpression は任意の ANSI 標準結合構文)。

ON 節のある結合では ANSI 結合キーワード構文のみ使用できます。

関連項目

FeedbackOpens in a new tab