我正在学习 PostgreSQL 并试图弄清楚如何创建一个临时表或一个WITH可以用来代替常规表的声明,以用于调试目的。
我查看了CREATE TABLE的文档,它说VALUES可以用作查询,但没有给出示例;VALUES其中链接的条款的文档也没有示例?
所以,我写了一个简单的测试如下:
DROP TABLE IF EXISTS lookup;
CREATE TEMP TABLE lookup (
key integer,
val numeric
) AS
VALUES (0,-99999), (1,100);
Run Code Online (Sandbox Code Playgroud)
但是 PostgreSQL (9.3) 抱怨
“AS”处或附近的语法错误
我的问题是:
我怎样才能修正上面的说法?
我如何调整它以用于WITH block?
提前致谢。
PostgreSQL 中有一个旧的和不推荐使用的命令,它早于CREATE TABLE AS SELECT(CTAS)称为SELECT ... INTO .... FROM,它支持WITH子句/公共表表达式(CTE)。所以,例如,我可以做到这一点..
WITH w AS (
SELECT *
FROM ( VALUES (1) ) AS t(x)
)
SELECT *
INTO foo
FROM w;
Run Code Online (Sandbox Code Playgroud)
但是,我不能这样做..
WITH w AS (
SELECT *
FROM ( VALUES (1) ) AS t(x)
)
CREATE TABLE foo AS
SELECT * FROM w;
Run Code Online (Sandbox Code Playgroud)
或者,我得到
ERROR: syntax error at or near "CREATE"
LINE 5: CREATE TABLE foo AS
Run Code Online (Sandbox Code Playgroud)
我将如何使用标准化的 CTAS 语法来做到这一点。
我正在将数据插入临时表并且它工作正常。下面是相同的 psedo sql 代码
with cte as(
)
select *
into temp_table
from cte
Run Code Online (Sandbox Code Playgroud)
使用这种方法,数据可以非常快地插入临时表中。根据我的知识,一旦会话关闭,临时表就会被删除。但是即使关闭了我的 pgadmin 连接,我的临时表也不会被删除。
我的问题是 postgresql 中的临时表是自动删除还是保留在磁盘空间上,直到我们删除它们。
问候,
桑杰·萨伦赫
以下是同一事物的两种不同语法。
带有COPY TABLE AS SELECT( CTAS)。
CREATE TABLE main
AS
SELECT *
FROM other;
Run Code Online (Sandbox Code Playgroud)作为单独的语句CREATE TABLE和INSERT INTO
CREATE TABLE main (like other);
INSERT INTO main
SELECT *
FROM other;
Run Code Online (Sandbox Code Playgroud)我观察到的CTAS比明显快CREATE TABLE.. INSERT。第一个需要 20 秒才能完成执行。第二个语法二需要 1 分 15 秒才能完成执行。
差异的原因可能是什么?