在PostgreSQL中:
WITH
子句是否创建临时视图或临时表? (如果我是正确的,则视图存储查询的代码,而表存储查询的结果)
CREATE TEMPORARY VIEW
创建一个仅在当前会话中可用的临时视图。
那么WITH
创建的临时视图和CREATE TEMPORARY VIEW
创建的临时视图有什么区别?
数据库系统概念似乎暗示WITH
创建一个临时视图而不是临时表:
从SQL:1999版本开始,SQL标准使用with递归子句支持一种有限形式的递归,其中视图(或临时视图)是 表达本身。可以使用递归查询来表示 简洁地关闭传递。回想一下, with子句用于定义临时视图,其定义仅可用于定义该视图的查询。 额外的关键字递归指定视图是递归的。
答案 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注意随机列匹配。
进行相同查询的另一种方法是