web-dev-qa-db-ja.com

SQLで一時テーブルを作成する

特定の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を使用しています。
クエリの何が問題なのか教えてください。

47
user1970850

あなたはおそらく _CREATE TABLE AS_ -TEMPORARYTEMP)テーブルでも動作します:

_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_

これにより、一時テーブルが作成され、そこにデータがコピーされます。 静的スナップショットデータについては、気にしないでください。通常のテーブルと同じですが、RAM _temp_buffers_が十分に高く設定されている場合、現在のsession内でのみ表示され、最後に停止します_ON COMMIT DROP_で作成された場合、transactionの最後で終了します。

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

dynamicが必要な場合は、 _CREATE VIEW_ -完全に別の話。

SQL標準も定義しており、Postgresは以下もサポートしています。 _SELECT INTO_
ただし、使用は推奨されません

新しいコードでは、この目的で_CREATE TABLE AS_を使用するのが最適です。

2番目の構文バリアントは本当に必要ありません。また、plpgsqlでの割り当てには_SELECT INTO_が使用されます。この場合、SQL構文は使用できません。

関連する:


CREATE TABLE LIKE (...) は、structureを別のテーブルからのみコピーし、データはコピーしません。

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


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

90
5
Chains