Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (日本語) » SQL Anywhere サーバ - SQL の使用法 » データのクエリと変更 » ジョイン:複数テーブルからのデータ検索 » キー・ジョイン » テーブル式のキー・ジョイン

 

カンマを含まないテーブル式とリストのキー・ジョイン

テーブル式リストがカンマを含まないテーブル式を持つキー・ジョインを介してジョインされる場合、SQL Anywhere はテーブル式リストの各テーブルに対してジョイン条件を生成します。

たとえば、次の文は、テーブル式リストと、カンマを含まないテーブル式のキー・ジョインです。この例では、テーブル式 C NATURAL JOIN D が指定されたテーブル A と、テーブル式 C NATURAL JOIN D が指定されたテーブル B のジョイン条件が生成されます。

SELECT *
FROM (A,B) KEY JOIN (C NATURAL JOIN D);

(A,B) はテーブル式のリストで、C NATURAL JOIN D はテーブル式です。したがって、SQL Anywhere は 2 つのジョイン条件を生成する必要があります。1 つは A-C と A-D ペアのジョイン条件で、もう 1 つは B-C と B-D ペアのジョイン条件です。このように外部キー関係が複数存在する場合は、次のキー・ジョイン規則に従って処理されます。

  • テーブル・ペアの各セットに対して、プライマリ・キー・テーブルの 1 つの相関名と同じ名前の役割名を持つ外部キーが検索される。この基準に合う外部キーが 1 つだけ存在する場合には、それが使用される。2 つ以上見つかると、そのジョインはあいまいになりエラーが発行される。

  • テーブル・ペアの各セットに、テーブルの相関名と同じ名前の外部キーがない場合は、そのテーブル間の外部キー関係が検索される。存在する外部キー関係が 1 つだけであれば、それが使用される。2 つ以上見つかると、そのジョインはあいまいになりエラーが発行される。

  • テーブル・ペアの各セットに、外部キー関係がまったく存在しない場合は、エラーが発行される。

  • 各ペアにジョイン条件を 1 つだけ決定できる場合は、キーワード AND によってジョイン条件が組み合わされる。

例 1

次の 5 つのテーブルのジョインを考えてみます。

((A,B) JOIN (C NATURAL JOIN D) ON A.x = D.y) KEY JOIN E

この場合、(A,B) と E の間の条件、または C NATURAL JOIN D と E の間の条件のどちらか 1 つが生成されることで、E に対するキー・ジョイン条件が生成されます。これについては、カンマを含まないテーブル式のキー・ジョインを参照してください。

(A,B) と E の間にジョイン条件が生成される場合は、A-E と B-E に 1 つずつ、合計 2 つのジョイン条件が作成される必要があります。それぞれのテーブル・ペア内では有効な外部キー関係が検出される必要があります。これについては、テーブル式リストのキー・ジョインを参照してください。

C NATURAL JOIN D と E の間にジョイン条件が作成される場合、ジョイン条件は 1 つだけ作成されるため、C-E と D-E のペア内で検出される必要がある外部キー関係は 1 つだけです。これについては、カンマを含まないテーブル式のキー・ジョインを参照してください。

例 2

次は、テーブル式とテーブル式リストのキー・ジョインの例です。この例では、営業担当兼管理者である従業員の名前と部署を示します。

SELECT DISTINCT Employees.Surname, 
        FK_DepartmentID_DepartmentID.DepartmentName
FROM ( SalesOrders, Departments 
        AS FK_DepartmentID_DepartmentID )
    KEY JOIN ( Employees JOIN Departments AS d
        ON Employees.EmployeeID = d.DepartmentHeadID );

次の 2 つのジョイン条件が生成されます。

  • テーブル・ペア SalesOrders/Employees と SalesOrders/d の間には外部キー関係が 1 つだけ存在する (SalesOrders.SalesRepresentative = Employees.EmployeeID)。

  • テーブル・ペア FK_DepartmentID_DepartmentID/Employees と FK_DepartmentID_DepartmentID/d の間には外部キー関係が 1 つだけ存在する (FK_DepartmentID_DepartmentID.DepartmentID = Employees.DepartmentID)。

この例は次の文と同義です。次の例では、相関名 Departments AS FK_DepartmentID_DepartmentID を作成する必要はありません。相関名が必要になるのは、Employees と Departments のジョインに使用する 2 つの外部キーを明示する場合だけです。

SELECT DISTINCT Employees.Surname, 
   Departments.DepartmentName
FROM ( SalesOrders, Departments )
    JOIN ( Employees JOIN Departments AS d
       ON Employees.EmployeeID = d.DepartmentHeadID )
    ON SalesOrders.SalesRepresentative = Employees.EmployeeID
       AND Departments.DepartmentID = Employees.DepartmentID;