56

特定のデータのみを選択する一時テーブルを作成しようとしていますregister_type。私はこのクエリを書きましたが、うまくいきません:

$ CREATE TABLE temp1
(Select 
    egauge.dataid,
    egauge.register_type,
    egauge.timestamp_localtime,
    egauge.read_value_avg
from rawdata.egauge
where register_type like '%gen%'
order by dataid, timestamp_localtime ) $

私はPostgreSQLを使用しています。
クエリの何が問題なのか教えてください。

4

2 に答える 2

108

おそらく必要ですCREATE TABLE AS- TEMPORARY( TEMP)テーブルでも機能します:

CREATE TEMP TABLE temp1 AS
SELECT dataid
     , register_type
     , timestamp_localtime
     , read_value_avg
FROM   rawdata.egauge
WHERE  register_type LIKE '%gen%'
ORDER  BY dataid, timestamp_localtime;

これにより、一時テーブルが作成され、データがそこにコピーされます。データの静的スナップショットです。これは通常のテーブルと同じですが、temp_buffers十分に高く設定されている場合は RAM に常駐します。現在のセッション内でのみ表示され、セッションの最後に消滅します。それを使用して作成すると、トランザクションON COMMIT DROPの終了時に死亡します。

一時テーブルはデフォルトのスキーマ検索パスで最初に来て、スキーマで修飾されていない限り、同じ名前の他の可視テーブルを非表示にします:


dynamicが必要な場合はCREATE VIEW、まったく別のストーリーを探します。


SQL 標準でも定義されており、Postgres もサポートしていますSELECT INTOしかし、その使用はお勧めできません:

CREATE TABLE ASこの目的には、新しいコードで使用するのが最適です。

2 番目の構文バリアントは実際には必要なく、結果的に SQL 構文がSELECT INTO使用できない で代入に使用されます。plpgsql

関連している:


CREATE TABLE LIKE (...)別のテーブルから構造をコピーするだけで、データはコピーしません:

このLIKE句は、新しいテーブルがすべての列名、それらのデータ型、およびそれらの非 null 制約を自動的にコピーするテーブルを指定します。


単一のクエリの目的のためだけに「一時」テーブルが必要な場合 (その後破棄する場合)、CTE またはサブクエリの「派生テーブル」のオーバーヘッドはかなり少なくなります。

于 2013-03-29T09:40:11.430 に答える
6

http://www.postgresql.org/docs/9.2/static/sql-createtable.html

CREATE TEMP TABLE temp1 LIKE ...
于 2013-03-28T20:20:49.013 に答える