リテラルおよび列式の引数
リテラル引数と列式引数を組み合わせて使用する場合は、相関表関数を呼び出します。
注: 相関サブクエリ(リピーティング・サブクエリとも呼ばれる)は、外部テーブルへの参照を含む特別なテーブル、行、またはスカラー・サブクエリです。 相関副照会には時間がかかる可能性があるため使用しないでください。
これは、相関副照会では、外部表の入力行ごとに副照会が 1 回評価されるためです。 相関のあるサブクエリのサポートには制限があります。
ラテラル副照会 は、FROM 節に指定される特殊な形式の相関副照会であり、同じ FROM 節で先に指定されている外部表への参照を含むものです。 通常は LATERAL キーワードでこのタイプの相関が指定されますが、TABLE キーワードを使用することもできます。 Netezza Performance Serverは LATERAL キーワードをサポートせず、UDTF に対してのみ TABLE キーワードをサポートします (SQL サブクエリではサポートしません)。
表関数から参照される列が含まれている表は、SQL 照会において表関数の呼び出しより先に指定する必要があります。 表関数の呼び出しが JOIN 結合の呼び出しのように見える場合であっても、表関数は、表関数で使用される列を持つ表とラテラルに相関させられます。 UDTF には、内部相関と左外部相関という 2 つの形式のラテラル相関があります。
- 内部相関 を使用すると、表関数は入力行ごとに 1 回呼び出されます。 表出力には、入力行に対して生成されたすべての出力行と、対応する入力行が含まれます。 入力行に対して表関数が出力行を生成しなかった場合、その入力行は表出力から除外されます。 また、入力行に対して表関数が出力行を生成したが、結合修飾子が false と評価された場合も、その入力行は組み合わせの出力から除外されます。 TABLE WITH FINAL 構文を使用して呼び出すことができる UDTF の場合は、WITH FINAL 処理の結果、出力行数が多くなる可能性があります。 以下に 2 つの例を示します。
mydb.schema(usr1)=> SELECT t.cust_id, f.product_id FROM orders AS t, TABLE ( parseNames(prod_codes) ) AS f WHERE t.cust_id='AB123456'; cust_id | product_id ----------+------------ AB123456 | 124 AB123456 | 6 AB123456 | 12 AB123456 | 121 AB123456 | 87 AB123456 | 182 (6 rows) mydb.schema(usr1)=> SELECT t.cust_id, f.product_id FROM orders AS t, TABLE ( parseNames(prod_codes) ) AS f WHERE t.cust_id='AB223456'; cust_id | product_id ----------+------------ (0 rows) - 左外部相関 を使用した場合の重要な相違点は、入力行について出力が生成されなかったり、結合修飾子が false と評価されたりした場合に、UDTF が、その行の列に NULL 値を入れて表関数の結果を表示する点です。 例:
mydb.schema(usr1)=> SELECT * FROM orders AS f LEFT OUTER JOIN TABLE(parsenames(f.prod_codes)) ON product_id='121'; ORDER_ID | CUST_ID | SALE_DATE | PROD_CODES | PRODUCT_ID ----------+----------+------------+-----------------------+------------ 150 | CD876543 | 2010-09-05 | 80,43,55,12,4,67,92 | 142 | AB664353 | 2010-09-04 | 1,145,52,53,93,98,100 | 124 | AB123456 | 2010-08-26 | 124,6,12,121 | 121 143 | AB123456 | 2010-09-05 | 87,182 | 120 | AB876123 | 2010-09-05 | 28,36,80 | 131 | AB643623 | 2010-09-02 | 12,88,41 | 132 | AB643623 | 2010-09-04 | 121 | 121 125 | AB987657 | 2010-08-26 | 8 | 126 | AB456754 | 2010-09-01 | 32,5,76,65,121,98 | 121 (9 rows)
ラテラル相関表関数には、以下の追加の制約事項があります。
- 結合対象表にラテラルに相関させる RIGHT OUTER JOIN に指定することはできません。
- 結合対象表にラテラルに相関させる FULL OUTER JOIN に指定することはできません。
- 結合節で表にラテラルに相関させる LEFT OUTER または INNER JOIN で使用する際、得られるのは結合動作ではなく相関動作です。