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 ではテーブルと同じ基本手順に従います。ただし、次の点が異なります。

  • 各キー・ジョインについて、クエリとビューの FROM 句内のテーブルのペアが調べられ、すべてのペアのセットに対してジョイン条件が 1 つ生成される。この場合、ビュー内の FROM 句にカンマやジョインのキーワードが含まれているかどうかは考慮されない。

  • ビューまたは派生テーブルの相関名と同じ役割名を持つ外部キーに基づいてテーブルがジョインされる。

  • キー・ジョイン内にビューまたは派生テーブルが含まれる場合、ビューまたは派生テーブル定義には UNION、INTERSECT、EXCEPT、ORDER BY、DISTINCT、GROUP BY などの集合関数や TOP、FIRST、START AT、FOR XML などの Window 関数を含めることはできない。これらが 1 つでも入っていると、エラーが返される。さらに、派生テーブルは再帰テーブル式として定義することはできない。

    派生テーブルとビューの機能は同じです。派生テーブルの場合、定義済みのビューを参照しないで、テーブルの定義を文中に記述する点だけが異なります。

    再帰テーブル式の詳細については、再帰共通テーブル式RecursiveTable アルゴリズム (RT)を参照してください。

例 1

次の文では、View1 がビューです。

SELECT *
FROM View1 KEY JOIN B;

View1 の定義は次のいずれかになるため、結果的に、B に対して同じジョイン条件になります (結果セットは異なりますが、ジョイン条件は同じです)。

SELECT *
FROM C CROSS JOIN D;

または

SELECT *
FROM C,D;

または

SELECT *
FROM C JOIN D ON (C.x = D.y);

いずれの場合も、View1 と B のキー・ジョインに対してジョイン条件を生成するには、テーブル・ペア C-B と D-B が調べられ、ジョイン条件が 1 つだけ生成されます。ジョイン条件はテーブル式のキー・ジョインで説明した複数の外部キー関係に関する規則に基づいて生成されます。ただし、ビューの参照テーブルではなく、ビューの相関名と同じ名前の外部キーを検索することが異なります。

前述のビュー定義のいずれかを使用すると、View1 KEY JOIN B の処理を次のように解釈できます。

テーブル・ペア C-B と D-B が調べられ、ジョイン条件が 1 つだけ生成されます。複数の外部キー関係が存在する場合には、次のキー・ジョイン決定規則に基づいてジョイン条件が生成されます。

  • まず、ビューの相関名と同じ役割名を持つ 1 つの外部キーに対して C-B と D-B が両方とも調べられる。この基準に合う外部キーが 1 つだけ存在する場合には、それが使用される。ビューの相関名と同じ役割名の外部キーが 2 つ以上ある場合、そのジョインはあいまいと見なされてエラーが発行される。

  • ビューの相関名と同じ名前の外部キーがない場合は、そのテーブル間の外部キー関係が検索される。見つかった外部キー関係が 1 つであれば、それが使用される。2 つ以上見つかると、そのジョインはあいまいと見なされてエラーが発行される。

  • 外部キー関係がまったく存在しない場合は、エラーが発行される。

ここで生成されたジョイン条件が B.y = D.z であると想定します。次に示す元のジョインを展開できます。たとえば、次の 2 つの文は同等です。

SELECT *
FROM View1 KEY JOIN B;

SELECT *
FROM View1 JOIN B ON B.y = View1.z;

複数の外部キー関係がある場合のキー・ジョインを参照してください。

例 2

次の例は、各部署の管理者に関する全従業員情報を含むビューです。

CREATE VIEW V AS
SELECT Departments.DepartmentName, Employees.*
FROM Employees JOIN Departments
  ON Employees.EmployeeID = Departments.DepartmentHeadID;

次のクエリはテーブル式に対するビューをジョインします。

SELECT *
FROM V KEY JOIN ( SalesOrders, 
   Departments FK_DepartmentID_DepartmentID );

次のクエリは前述のクエリと同等です。

SELECT *
FROM V JOIN ( SalesOrders, 
   Departments FK_DepartmentID_DepartmentID )
ON ( V.EmployeeID = SalesOrders.SalesRepresentative
AND V.DepartmentID = 
    FK_DepartmentID_DepartmentID.DepartmentID );