外部ジョインでよくある間違いは、ジョイン条件を置く場所に関するものです。通常は、WHERE 句を使って NULL 入力テーブルに制限を加えると、そのジョインは内部ジョインと同義になります。
これは、ほとんどの探索条件では、入力した探索条件のうち 1 つでも NULL になっていると TRUE と評価できないためです。NULL 入力テーブルに対する WHERE 句での制限によって、それぞれの値は NULL と比較され、結果セットからそのローは除外されます。保護されたテーブルのローは保護されないので、このジョインは内部ジョインです。
これに対する例外は、入力値のいずれかが NULL の場合は TRUE と評価できる比較です。こうした比較には、IS NULL、IS UNKNOWN、IS FALSE、IS NOT TRUE があります。また、ISNULL や COALESCE を含む式もあります。
たとえば、次の文は左外部ジョインを計算します。
SELECT * FROM Customers KEY LEFT OUTER JOIN SalesOrders ON SalesOrders.OrderDate < '2000-01-03'; |
これに対し、次の文は内部ジョインを作成します。
SELECT Surname, OrderDate FROM Customers KEY LEFT OUTER JOIN SalesOrders WHERE SalesOrders.OrderDate < '2000-01-03'; |
この 2 つの文のうち、最初の文は次のように考えられます。まず、Customers テーブルを SalesOrders テーブルに左外部ジョインします。結果セットには Customers テーブルのすべてのローが入ります。2000 年 1 月 3 日より前に注文をしていない顧客については、sales order フィールドに NULL が入ります。
2 番目の文では、まず Customers と SalesOrders を左外部ジョインします。結果セットには Customers テーブルのすべてのローが入ります。注文をしていない顧客については、sales order フィールドに NULL が入ります。次に、2000 年 1 月 3 日以降に発注した顧客のローだけを選択することによって WHERE 条件が適用されます。発注しなかった顧客については、これらの値が NULL になります。任意の値を NULL と比較した結果は、UNKNOWN と評価されます。したがって、これらのローは削除されて、文は内部ジョインに縮小されます。
探索条件の詳細については、探索条件を参照してください。
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |