EDIT: Tôi đang để lại câu trả lời được chấp nhận ban đầu, nhưng xin lưu ý rằng chỉnh sửa bên dưới, như được đề xuất bởi a_horse_with_no_name, là phương pháp ưa thích để tạo bảng tạm thời bằng cách sử dụng GIÁ TRỊ.
Nếu bạn chỉ muốn chọn từ một số giá trị, thay vì chỉ tạo một bảng và chèn vào nó, bạn có thể làm một cái gì đó như:
WITH vals (k,v) AS (VALUES (0,-9999), (1, 100))
SELECT * FROM vals;
Để thực sự tạo một bảng tạm thời theo cách tương tự, hãy sử dụng:
WITH vals (k,v) AS (VALUES (0,-9999), (1, 100))
SELECT * INTO temporary table temp_table FROM vals;
EDIT: Như được chỉ ra bởi a_horse_with_no_name, trong các tài liệu có trạng thái CREATE TABLE AS...
tương tự về chức năng SELECT INTO ...
, nhưng cái trước là một superset của cái sau và SELECT INTO
được sử dụng trong plpgslq để gán giá trị cho biến tạm thời - vì vậy nó sẽ thất bại trường hợp. Do đó, trong khi các ví dụ trên là hợp lệ cho SQL đơn giản, CREATE TABLE
biểu mẫu nên được ưu tiên.
CREATE TEMP TABLE temp_table AS
WITH t (k, v) AS (
VALUES
(0::int,-99999::numeric),
(1::int,100::numeric)
)
SELECT * FROM t;
Lưu ý, cũng từ các nhận xét của a_horse_with_no_name và trong câu hỏi ban đầu của OP, điều này bao gồm việc truyền vào các kiểu dữ liệu chính xác trong danh sách giá trị và sử dụng câu lệnh CTE (VỚI).
Ngoài ra, như đã chỉ ra trong câu trả lời của Evan Carrol, truy vấn CTE là một hàng rào tối ưu hóa , nghĩa là CTE luôn được cụ thể hóa. Có nhiều lý do tốt để sử dụng CTE, nhưng có thể có một hiệu suất đáng kể, nếu không được sử dụng cẩn thận. Tuy nhiên, có nhiều trường hợp trong đó hàng rào tối ưu hóa thực sự có thể nâng cao hiệu suất, vì vậy đây là điều cần lưu ý, không nên tránh một cách mù quáng.