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

SQL Anywhere 12.0.1 » SQL Anywhere サーバー SQL の使用法 » データの問い合わせと修正 » ジョイン:複数テーブルからのデータ検索 » 内部ジョインと外部ジョイン » 外部ジョイン

 

複雑な外部ジョイン

クエリに外部ジョインを使用したテーブル式が含まれるときは、ジョインの順序が重要になります。たとえば、A JOIN B LEFT OUTER JOIN C は、(A JOIN B) LEFT OUTER JOIN C と解釈されます。つまり、テーブル式 (A JOIN B) が C にジョインされます。このとき、テーブル式 (A JOIN B) は保護され、テーブル C には NULL が入力されます。

次に、以下の文を考えてみます。A、B、C はテーブルです。

SELECT *
FROM A LEFT OUTER JOIN B RIGHT OUTER JOIN C;

この文を理解するには、まず「SQL Anywhere では文が左から右に評価され、カッコが追加される」という規則を思い出してください。結果は次のようになります。

SELECT *
FROM (A LEFT OUTER JOIN B) RIGHT OUTER JOIN C;

次に、両方のジョインが同じタイプになるように、右外部ジョインを左外部ジョインに変換します。これを行うには、右外部ジョインにあるテーブルの位置を単純に逆にします。結果は次のようになります。

SELECT *
FROM C LEFT OUTER JOIN (A LEFT OUTER JOIN B);

ネストした外部ジョインでは、A が保護テーブルであり、B が NULL 入力テーブルです。最初の外部ジョインでは C が保護テーブルです。

この結合は次のように解釈できます。

  • A を B に結合します。このとき、A のローはすべて保護されます。

  • 次に、C を A と B のジョインの結果に結合します。このとき、C のローはすべて保護されます。

このジョインには ON 句がないため、デフォルトのキージョインになります。

また、外部ジョインのジョイン条件には、必ず、FROM 句内で先に参照されているテーブルだけを入れます。この制限事項は ANSI/ISO 標準に基づくものであり、あいまいさを排除するためのものです。たとえば、次の 2 つの文は構文的に正しくありません。テーブル自体が参照される前に C がジョイン条件内で参照されるからです。

SELECT *
FROM (A LEFT OUTER JOIN B ON B.x = C.x) JOIN C;

SELECT *
FROM A LEFT OUTER JOIN B ON A.x = C.x, C;
 参照