キー・ジョインにビューまたは派生テーブルが含まれている場合、SQL Anywhere ではテーブルと同じ基本手順に従います。ただし、次の点が異なります。
各キー・ジョインについて、クエリとビューの FROM 句内のテーブルのペアが調べられ、すべてのペアのセットに対してジョイン条件が 1 つ生成される。この場合、ビュー内の FROM 句にカンマやジョインのキーワードが含まれているかどうかは考慮されない。
ビューまたは派生テーブルの相関名と同じ役割名を持つ外部キーに基づいてテーブルがジョインされる。
キー・ジョイン内にビューまたは派生テーブルが含まれる場合、ビューまたは派生テーブル定義には UNION、INTERSECT、EXCEPT、ORDER BY、DISTINCT、GROUP BY などの集合関数や TOP、FIRST、START AT、FOR XML などの Window 関数を含めることはできない。これらが 1 つでも入っていると、エラーが返される。さらに、派生テーブルは再帰テーブル式として定義することはできない。
派生テーブルとビューの機能は同じです。派生テーブルの場合、定義済みのビューを参照しないで、テーブルの定義を文中に記述する点だけが異なります。
再帰テーブル式の詳細については、再帰共通テーブル式とRecursiveTable アルゴリズム (RT)を参照してください。
次の文では、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; |
複数の外部キー関係がある場合のキー・ジョインを参照してください。
次の例は、各部署の管理者に関する全従業員情報を含むビューです。
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 ); |
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |