【发布时间】:2017-03-31 05:01:42
【问题描述】:
我正在处理一个复杂的查询。它涉及几个表。
创建一个新表然后简单地从中查询对我很有帮助。但是,这是一个共享数据库,我不想创建一个新表,尤其是当我不打算专门使用该表时。 (我只是希望它作为我查询的垫脚石)
是否可以仅为 1 个查询创建一个表,该表在查询完成时立即删除? (即临时表)
【问题讨论】:
-
@GGG 哎呀,我的错
标签: sql postgresql pgadmin
我正在处理一个复杂的查询。它涉及几个表。
创建一个新表然后简单地从中查询对我很有帮助。但是,这是一个共享数据库,我不想创建一个新表,尤其是当我不打算专门使用该表时。 (我只是希望它作为我查询的垫脚石)
是否可以仅为 1 个查询创建一个表,该表在查询完成时立即删除? (即临时表)
【问题讨论】:
标签: sql postgresql pgadmin
使用关键字temporary,临时表仅在您当前的连接中可见,并在您断开连接后丢弃。
另一种方法是创建一个表并在不需要时自行删除表
【讨论】:
您可以使用临时表,它会在创建它们的会话结束时自行删除(而不是在查询完成后,如您所说)。不过,您始终可以在操作结束时手动删除它。
如果您想创建这样的表作为查询的结果,那么这是要根据您的需要扩展的示例:
CREATE TEMP TABLE tmp_table_name AS ( SELECT 1 AS col1 );
但我认为您可能正在寻找 CTE 而不是表格,因为您说您打算只使用一次。考虑一下:
WITH tmp_table AS ( SELECT 1 AS col1 )
SELECT *
FROM tmp_table
...
【讨论】:
你也可以做动态查询的结果也是一个表
select * from (select col1, col2, col3
from my_complex_table
... ) t1
【讨论】:
当然。使用CREATE TEMPORARY TABLE:
=> CREATE TEMPORARY TABLE secret_table(id BIGSERIAL, name text);
=> INSERT INTO secret_table(name) VALUES ('Good day');
INSERT 0 1
=> INSERT INTO secret_table(name) VALUES ('Good night');
INSERT 0 1
=> SELECT * FROM secret_table;
id | name
----+------------
1 | Good day
2 | Good night
(2 rows)
但在重新连接时:
psql (9.5.4)
Type "help" for help.
=> SELECT * FROM secret_table;
ERROR: relation "secret_table" does not exist
LINE 1: SELECT * FROM secret_table;
【讨论】:
ON COMMIT DROP 选项在事务中运行时也可能很有用。