2012-02-09 10 views
39

永続テーブルと同じ列とタイプの一時テーブルを作成する必要があります。それを行う最善の方法は何ですか?通常、私はこのようなテーブルを作成永続テーブルと同じ列とタイプの一時テーブルを作成する最も良い方法

すなわち

(パーマネントテーブルには、100以上の列があります)。

しかし、カラム名とタイプに言及せずに、必要なカラムを持つ別のテーブルの名前を記述する方法はありますか?

+1

これは一時表ではなく、表変数です。 –

+0

@ nathangonzalez-はい。質問を更新しています。私は答えが両方に適用されると信じています。 – Ananth

+0

@Ananth、テーブル変数は明示的に宣言しなければならないので、もともとはそれが取得します。 tempテーブルは 'select into'ステートメントを使用して作成することができます。これは、ddl –

答えて

86
select top 0 * 
into #mytemptable 
from myrealtable 
+1

+1 "where 0 = 1"となっていましたが、あなたのソリューションは高速です。 –

+1

@ JoachimIsaksson - ちょうど興味のない、あなたはどのようにそれを測定しましたか?私は自分でいくつかの原油テストを行い、両者の間に違いは見られません。 –

+0

@MikaelErikssonより深い分析はしませんでしたが、古いSQLサーバーを実行していて、テーブルまたはインデックスにアクセスしていないようですが、0 = 1がプライマリキーインデックスにアクセスしているようです。違いがどれほど大きいのかよく分かりませんが、テストする巨大なテーブルはありません。また、これは実装に依存すると思われますので、新しいバージョンでは異なる可能性があります。 –

7

Sortest 1 ...

select top 0 * into #temptable from mytable 

注:これは一時の空のコピーを作成し、しかし、それはこれがある

+0

これはすべてのデータも挿入します。 –

+0

@ nathangonzalez:私は試して、ソリューションは完璧に働いた..ちょうどテーブルがデータなしで作成されました – Ananth

+0

@Ananth、答えは私のコメントの後に編集されました。 –

1
select * into #temptable from tablename where 1<>1 
+0

私が間違っていない場合、ここでの落ち込みは、SQL Serverがテーブルの各行に対して1 <> 1を評価しなければならないということです。 –

+2

@nathangonzalez:いいえ、それはありません。オプティマイザはそれほどダムではありません。 –

+0

@ypercube、それから間違いだと思います。私はそれが一定のスキャンを参照してください。私がチェックしたはずだとします。 –

7

主キーを作成しません。 MySQL固有の答え、それ以外のところでは動作しない -

空のt

CREATE TEMPORARY TABLE temp_foo LIKE foo; 

そして、あなたが持つ既存のテーブルの人口コピーを作成することができます:と同じ列定義を持つことができ

CREATE TEMPORARY TABLE temp_foo SELECT * FROM foo; 

とpostgresの中に、次の作品を。残念ながら、異なるRDBMSさんはここで非常に一貫していないようです:

CREATE TEMPORARY TABLE temp_foo AS SELECT * FROM foo; 
6

私はこの質問は非常に古いですが実現するが、PostgreSQLの固有の解決策を探している人のために、それはだ:、

CREATE TEMP TABLE tmp_table AS SELECT * FROM original_table LIMIT 0; 

注意tempテーブルはpg_temp_3のようなスキーマに入れられます。

これは(インデックスなし)のすべての列を持つことになりますし、データなしで、しかし、あなたのニーズに応じて、あなたは主キーを削除することがあり、一時テーブルを作成します。

ALTER TABLE pg_temp_3.tmp_table DROP COLUMN primary_key; 

場合元のテーブルにはデータが入っていないので、 "LIMIT 0"を省略することができます。

関連する問題