2013-03-28 57 views
34

Tôi đang cố gắng tạo một bảng tạm thời chỉ chọn dữ liệu cho một số register_type nhất định. Tôi đã viết truy vấn này nhưng nó không hoạt động:Tạo các bảng tạm thời trong SQL

$ 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) $ 

Tôi đang sử dụng PostgreSQL.
Bạn có thể cho tôi biết có gì sai với truy vấn không?

+0

Tôi đang sử dụng một bảng gọi là rawdata.egauge thực – user1970850

+10

* không hoạt động * không phải là một thông báo lỗi Postgres hợp lệ. Bạn đang thiếu từ khóa 'AS', lựa chọn không nên nằm trong parathensis, và bạn không có dấu chấm phẩy ('; ') để chấm dứt câu lệnh. –

Trả lời

70

Bạn có thể muốn CREATE TABLE AS - cũng làm việc cho TEMPORARY (TEMP) bảng:

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

này tạo ra một bảng tạm thời và các bản sao dữ liệu vào nó. Ảnh chụp tĩnh tĩnh, hãy nhớ bạn. Nó giống như một bảng thông thường, nhưng nằm trong RAM nếu temp_buffers được đặt đủ cao, chỉ hiển thị trong phiên hiện tại và chết khi kết thúc. Khi được tạo với ON COMMIT DROP, nó sẽ chết vào cuối giao dịch .

bảng Temp đến trước trong mặc định đường dẫn tìm kiếm schema, ẩn bảng có thể nhìn thấy khác cùng tên trừ khi schema-trình độ:

Nếu bạn muốn động, bạn sẽ tìm kiếm CREATE VIEW - một câu chuyện hoàn toàn khác.

Chuẩn SQL cũng xác định và Postgres cũng hỗ trợ: SELECT INTO .
But its use is discouraged:

Tốt nhất là sử dụng CREATE TABLE AS cho mục đích này trong mã mới.

Thực sự không cần biến thể cú pháp thứ hai và SELECT INTO được sử dụng để gán trong plpgsql, do đó cú pháp SQL là không thể.

liên quan:


CREATE TABLE LIKE (...) chỉ sao chép cấu trúc từ bảng khác và không có dữ liệu:

Điều khoản LIKE chỉ định bảng mà từ đó bảng mới tự động sao chép tất cả các tên cột, loại dữ liệu của chúng và các hạn chế không giới hạn của chúng.


Nếu bạn cần một "tạm thời" bảng chỉ với mục đích của một truy vấn duy nhất (và sau đó loại bỏ nó) một "bảng có nguồn gốc" trong một CTE hoặc một subquery đi kèm với ít hơn đáng kể chi phí:

+2

Không biết 'chọn vào' là nản lòng .... – Xin

Các vấn đề liên quan