CREATE TABLE … AS操作中にターゲット テーブルにコピーされるものとコピーされないものを制御するルールのために、構文的に等価に見える一部の文が意味的に等価でないことがあります。
このトピックでは、等価および非等価のコーディングを説明するためにいくつかのシナリオを紹介します。
等価のセット1
次に示すCREATE TABLE … AS … WITH NO DATA文とCREATE TABLE … AS … WITH DATA文は等価です。両者とも、target_tableの列を定義するために同じ副クエリーを使用しているためです。
2番目の文は、テスト結果が常にFALSEになるWHERE句を使用してコーディングされていることに注意する必要があります。この句により、副クエリーのデータではなく、副クエリーの列の定義のみがtarget_tableに確実にコピーされます。
CREATE TABLE target_table AS (SELECT * FROM source_table ) WITH NO DATA; CREATE TABLE target_table AS (SELECT * FROM source_table WHERE 1=2 ) WITH DATA;
等価のセット2
以下のCREATE TABLE … AS … WITH DATA文は、その次に示すCREATE TABLE … AS…WITH NO DATA文とINSERT … SELECT文を対にした文と同じ処理を実行します。CREATE TABLE … AS … WITH NO DATA文は、正確なテーブルの定義をsource_tableからコピーし、INSERT … SELECTはtarget_tableにsource_tableのすべてのデータを入力します。
CREATE TABLE target_table AS ( SELECT * FROM source_table) WITH DATA; CREATE TABLE target_table AS source_table WITH NO DATA; INSERT target_table SELECT * FROM source_table;
非等価のセット1
最初のCREATE TABLE … AS … WITH NO DATA文は2番目の文と等ない。2番目の文の副クエリーが、テーブル オプション句で定義されている属性のデフォルトを使用しているためです。デフォルトとは異なる定義をするには、属性の名前を明示的に指定する必要があります。Subquery を使用したAS句のカスタマイズを参照してください。
CREATE TABLE target_table AS source_table WITH NO DATA;
source_tableがMULTISETであり、Teradataセッション モードでこのCREATE TABLE文を実行すると、target_tableのテーブルの種類もMULTISETとなります。
CREATE TABLE target_table AS ( SELECT * FROM source_table) WITH NO DATA;
条件は最初のCREATE TABLE文の場合と同じですが、この文はSETというテーブルの種類のtarget_tableを作成します。このリクエストは基本テーブルではなくソースに対する副クエリーを使用するからです。
非等価のセット2
この結果は「非等価のセット1」に対応します。
最初のCREATE TABLE … AS … WITH DATA文は2番目の文と等ない。2番目の文の副クエリーが、テーブル オプション句で定義されている属性のデフォルトを使用しているためです。デフォルトとは異なる定義をするには、属性の名前を明示的に指定する必要があります(Subquery を使用したAS句のカスタマイズを参照)。
CREATE TABLE target_table AS source_table WITH DATA; CREATE TABLE target_table AS ( SELECT * FROM source_table WITH DATA;