2017-07-13 9 views
1

現在、CREATE TABLE AS SELECT文を使用してテーブルを作成しようとしています。 SELECTステートメント内では、現在、多数のテーブル(10以上)にジョインされています。selectテーブルとしてcreate tableを使用すると重複するカラム名を避ける

CREATE TABLE table_name AS 
    SELECT 
    * 
    FROM 
    table_x x 
    LEFT JOIN 
    table_y y 
    on x.id=y.fid 
    LEFT JOIN 
    table_z z 
    on x.id=z.fid 
    ... 
    ... 
    ... 

テーブルの多くが(データではありませんが)列名を共有しているため、重複する列名エラーが発生しています。

私は、列名を生成するために怠惰な方法があるかどうか疑問に思っていたので、衝突はありません。たとえば、上記の例では、table_ytable_zの両方にfidという列があります。 y.idz.id、または類似した何かを呼ばれる列を生成する方法があった場合

私は思っていた(例えばy_idz_id)新しいテーブル内だけではなくidid

私は次のようAS文を、私は明示的に選択のすべての列を記述する必要がクエリを書き込まないようにしたい、と私たち:

CREATE TABLE table_name AS 
    SELECT 
    x.id as x_id, 
    y.fid as y_fid, 
    z.fid as z_fid, 
    ... 
    ... 
    ... 
    FROM 
    table_x x 
    LEFT JOIN 
    table_y y 
    on x.id=y.fid 
    LEFT JOIN 
    table_z z 
    on x.id=z.fid 
    ... 
    ... 
    ... 
+2

ベストプラクティスは、基になるテーブル構造が変更されたときに他のクエリ、関数、プロシージャが破損するのを防ぐために、新しい名前の開発者が何らかの変更を加えなければならない場合スクリプトに記述されている場合には、何が引き込まれているのかを知る上でより良い機会になります。新しいテーブルに必要でないカラムがいくつかあるので、それらを選択する必要はありません。 – MarkD

+0

この練習の一部は、複数のテーブルに記録されているデータを健全にチェックすることです。各列に各表の識別子を接頭辞として付けます。私は、参加するために使用される列間で値が重複することを十分に理解していますが、これは運用環境では使用されず、重複したコンテンツを持つことはこの使用例にとって大きな心配ではありません。 – jonhurlock

答えて

-1

を多分、私は何かが欠けているが、なぜです基本的に同じ値を持つ列を選択しますか?代わりの

SELECT x.id as x_id, y.fid as y_fid, z.fid as z_fid, . . . 

なぜないだけ?

SELECT x.id as x_id, . . . 

NULLに値が必要な理由はありますか?実際に一致が発生したかどうかを示すフラグは想像できますが、すべての列を含む理由はありません。

+0

練習の目的は、データを健全にチェックすることですが、(複数のテーブルにまたがって1つのテーブルに)データを非正規化することで、非正規化データに基づいて複数のビューを作成することができます。クエリ速度の向上とSQLの複雑さの軽減 – jonhurlock

+0

結合のために複製されない他の列がありますが、表全体に100を超える重複しない列があるため、各列名を明示的に手動で書き込む必要はありません。 select文では、これらの列名の一部が、異なるデータを表していても衝突します。したがって、テーブル接頭辞を持つことは便利です。 – jonhurlock

関連する問題