WITH创建的临时视图和CREATE TEMPORARY VIEW创建的临时视图之间的区别?

时间:2018-06-24 01:26:18

标签: postgresql

在PostgreSQL中:

  1. WITH子句是否创建临时视图或临时表? (如果我是正确的,则视图存储查询的代码,而表存储查询的结果)

  2. CREATE TEMPORARY VIEW创建一个仅在当前会话中可用的临时视图。

    那么WITH创建的临时视图和CREATE TEMPORARY VIEW创建的临时视图有什么区别?

数据库系统概念似乎暗示WITH创建一个临时视图而不是临时表:

  

从SQL:1999版本开始,SQL标准使用with递归子句支持一种有限形式的递归,其中视图(或临时视图)是   表达本身。可以使用递归查询来表示   简洁地关闭传递。回想一下, with子句用于定义临时视图,其定义仅可用于定义该视图的查询。   额外的关键字递归指定视图是递归的。

2 个答案:

答案 0 :(得分:2)

公用表表达式(CTE)仅可用于单个查询。

临时视图(如临时表)可用于当前会话中的所有查询。在会话结束时将其删除。

答案 1 :(得分:0)

它们与临时视图并不完全相同。

在postgres中,CTE(WITH子句)被实现为类似表格的形式 对象。而视图的行为更像是宏

当其中一列是具有副作用或返回不同值的函数时,此效果最明显。

select generate_series(1,3) as n into temp table a;  

一个带有1,2,3的简单表

create temporary view v as select n,random() as r from a;
select * from v as x join v as y on x.n=y.n;   

使用视图:请注意,随机列不匹配。 替换视图表达式可以得到相同的结果。

   select x.n,random(),y.n,random() 
   from a as x join a as y on x.n=y.n; 

  select * from (select n,random() from a ) as x join
        (select n,random() from a )  as y on x.n=y.n;   

但使用CTE:

with c as (select n,random() as r from a)
select * from c as x join c as y on x.n=y.n;   

使用CTE注意随机列匹配。

进行相同查询的另一种方法是