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 の使用法 » データのクエリと変更 » ジョイン:複数テーブルからのデータ検索 » キー・ジョイン

 

複数の外部キー関係がある場合のキー・ジョイン

外部キー関係に基づいてジョイン条件が生成されるときに、外部キー関係が 2 つ以上ある場合があります。このような場合、SQL Anywhere は、外部キーが参照するプライマリ・キー・テーブルの相関名と、外部キーの役割名とを一致させることによって、使用する外部キー関係を決定します。

次の項では、SQL Anywhere でキー・ジョインのジョイン条件が生成される過程について説明します。この情報の概要は、キー・ジョイン操作規則を参照してください。

相関名と役割名

「相関名」とは、クエリの FROM 句内で使用されるテーブル名またはビュー名のことです。元の名前か、FROM 句で定義されたエイリアスになります。

「役割名」は外部キーの名前です。役割名は、指定された外部 (子) テーブルに対してユニークでなければなりません。

外部キーに役割名を指定しない場合は、次のようにして名前が割り当てられます。

  • プライマリ・テーブル名と同じ名前の外部キーが存在しない場合は、役割名にはプライマリ・テーブル名が割り当てられる。

  • すでにプライマリ・テーブル名が別の外部キーによって使用されている場合は、役割名は、外部テーブルに対してユニークな、プライマリ・テーブル名と 0 埋め込みの 3 桁の数字が連結されたものになる。

外部キーの役割名がわからない場合は、Sybase Central で左ウィンドウ枠にあるデータベース・コンテナを展開すると検索できます。左ウィンドウ枠でテーブルを選択し、右ウィンドウ枠で [制約] タブをクリックします。右ウィンドウ枠にテーブルの外部キーのリストが表示されます。

SQL Anywhere サンプル・データベースにあるすべての外部キーの役割名を含む図については、サンプル・データベース・スキーマを参照してください。

ジョイン条件の生成

SQL Anywhere では、次のように、プライマリ・キー・テーブルの相関名と同じ役割名を持つ外部キーが検索されます。

  • ジョイン内のテーブルと同じ名前の外部キーが 1 つだけであれば、その外部キーが使用され、ジョイン条件が生成される。

  • テーブルと同じ名前の外部キーが 2 つ以上見つかると、そのジョインはあいまいとなりエラーが発行される。

  • テーブルと同じ名前の外部キーが 1 つもなければ、名前が一致しなくても外部キー関係が検索される。外部キー関係が 2 つ以上見つかれば、そのジョインはあいまいとなりエラーが発行される。

例 1

SQL Anywhere サンプル・データベースでは、テーブル Employees と Departments の間で 2 つの外部キー関係が定義されています。Employees テーブルの外部キー FK_DepartmentID_DepartmentID は Departments テーブルを参照し、Departments テーブルの外部キー FK_DepartmentHeadID_EmployeeID は Employees テーブルを参照しています。

Employees テーブルと Departments テーブルの外部キー関係。

次のクエリはあいまいです。外部キー関係が 2 つあり、そのどちらにもプライマリ・キー・テーブル名と同じ役割名が指定されていないからです。そのため、このクエリを実行しようとしても、結果は構文エラー SQLE_AMBIGUOUS_JOIN (-147) になります。

SELECT Employees.Surname, Departments.DepartmentName
FROM Employees KEY JOIN Departments;
例 2

このクエリは、Departments テーブルに相関名 FK_DepartmentID_DepartmentID を指定して例 1 のクエリを修正したものです。ここで、外部キー FK_DepartmentID_DepartmentID にはその参照テーブルと同じ名前が付けられているため、ジョイン条件を定義するために使用されます。結果には、すべての従業員の姓と所属部署が入っています。

SELECT Employees.Surname, 
    FK_DepartmentID_DepartmentID.DepartmentName
FROM Employees KEY JOIN Departments 
    AS FK_DepartmentID_DepartmentID;

次のクエリは上の例と同義です。この例では、Departments テーブルのエイリアスを作成する必要はありません。このクエリでは、上の例で生成されたジョイン条件と同じものが ON 句で指定されています。

SELECT Employees.Surname, Departments.DepartmentName
FROM Employees JOIN Departments
   ON Departments.DepartmentID = Employees.DepartmentID;
例 3

ある部署の責任者である従業員をすべてリストする場合は、外部キー FK_DepartmentHeadID_EmployeeID を使用し、例 1 を次のように書き換えます。このクエリは、プライマリ・キー・テーブル Employees に相関名 FK_DepartmentHeadID_EmployeeID を指定することで外部キー FK_DepartmentHeadID_EmployeeID を使用します。

SELECT FK_DepartmentHeadID_EmployeeID.Surname, Departments.DepartmentName
FROM Employees AS FK_DepartmentHeadID_EmployeeID 
    KEY JOIN Departments;

次のクエリは上の例と同義です。このクエリでは、上の例で生成されたジョイン条件が ON 句で指定されています。

SELECT Employees.Surname, Departments.DepartmentName
FROM Employees JOIN Departments
   ON Departments.DepartmentHeadID = Employees.EmployeeID;
例 4

外部キーの役割名がプライマリ・キー・テーブル名と同じ場合、相関名は不要です。たとえば、次のように、Employees テーブルに外部キー Departments を定義するとします。

ALTER TABLE Employees 
   ADD FOREIGN KEY Departments (DepartmentID) 
   REFERENCES Departments (DepartmentID);

ここで、KEY JOIN が 2 つのテーブル間で指定されていれば、この外部キー関係がデフォルトのジョイン条件になります。外部キー Departments が定義されていれば、次のクエリは例 3 と同義になります。

SELECT Employees.Surname, Departments.DepartmentName
FROM Employees KEY JOIN Departments;
注意

この例を Interactive SQL で実行する場合は、次の文を使って SQL Anywhere サンプル・データベースへの変更をリバースする必要があります。

ALTER TABLE Employees DROP FOREIGN KEY Departments;