クエリに外部ジョインを使用したテーブル式が含まれるときは、ジョインの順序が重要になります。たとえば、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; |
![]() |
DocCommentXchange で意見交換できます
|
Copyright © 2013, SAP AG or an SAP affiliate company. - SAP Sybase SQL Anywhere 16.0 |