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

 

テーブル式のナチュラル・ジョイン

ナチュラル・ジョインの少なくともどちらか一方の側に複数テーブルの式が 1 つ存在する場合、SQL Anywhere は、ジョイン演算子の左右にあるカラムを比較して、同じ名前のカラムを検索することでジョイン条件を生成します。

次の文を例にとります。

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

この文には 2 つのテーブル式があります。テーブル式 A JOIN B のカラム名がテーブル式 C JOIN D のカラム名と比較されると、一致するカラム名のうちあいまいさのないペアに対してジョイン条件が生成されます。「一致するカラム名のうちあいまいさのないペア」とは、カラム名が両方のテーブル式に出現することがあっても同一テーブル式内では 2 回出現しないという意味です。

あいまいなカラム名のペアが 1 つでもあると、エラーになります。ただし、カラム名がもう一方のテーブル式内のカラム名とも一致しなければ、カラム名が同じテーブル式で 2 回出現しても構いません。

ナチュラル・ジョイン・リスト

ナチュラル・ジョインの少なくとも片方の側にテーブル式のリストがある場合、そのリスト内の各テーブル式に対して別のジョイン条件が生成されます。

次のテーブルを考えてみます。

  • テーブル A はカラム a、b、c で構成されている。

  • テーブル B は、カラム a と d で構成されている。

  • テーブル C はカラム d と c で構成されている。

このような場合、SQL Anywhere ではジョイン (A,B) NATURAL JOIN C によって次の 2 つのジョイン条件が生成されます。

ON A.c = C.c
 AND B.d = C.d

A-C または B-C に共通のカラム名がなければ、エラーが発行されます。

テーブル C がカラム a、d、c で構成されている場合、ジョイン (A,B) NATURAL JOIN C は無効です。その理由は、カラム a が 3 つのテーブルすべてに出現するため、ジョインがあいまいになってしまうためです。

次の例は、「販売した製品と販売担当者の情報を売り上げ別に提供してほしい」という質問に対する回答です。

SELECT *
FROM ( Employees KEY JOIN SalesOrders )
  NATURAL JOIN ( SalesOrderItems KEY JOIN Products );

これは次と同義です。

SELECT *
FROM ( Employees KEY JOIN SalesOrders )
  JOIN ( SalesOrderItems KEY JOIN Products )
    ON SalesOrders.ID = SalesOrderItems.ID;