【发布时间】:2017-04-25 18:49:10
【问题描述】:
我一直认为 CTE 应该被视为内联视图宏。所以我的想法是:如果 CTE 没有被引用/使用,它就不会被执行。这只是一个定义,仅此而已。
但是,请执行以下查询:
create table t
(
id int primary key
);
with
a as
(
insert into t(id) values(1)
)
select false;
select * from t;
似乎在基于 CTE 的查询之后,select * from t 返回插入到 CTE 中的元组。尽管没有使用 CTE,为什么还要插入这个元组?
这是设计还是规范?依赖这种行为是否安全?这允许在一个查询中执行多个完全不相关的查询。
这似乎与以下信息相矛盾:https://blog.2ndquadrant.com/postgresql-ctes-are-optimization-fences/#comment-19121
【问题讨论】:
-
您可以在 CTE 中使用
INSERT吗?我相当肯定你只能使用SELECT语句。 -
@Dstanley 是的,你可以。我一直在做
INSERT、DELETE和UPDATE没有问题。唯一的区别是我总是提到 CTE,因为它使用RETURNING ...,但不是在这个问题中。 -
你能发布一个实际的例子吗?我在 CTE 中看到的只是
SELECT语句。 -
有趣 - SQL Server 绝对不允许在 CTE 中使用 DML。
-
@DStanley 请参阅stackoverflow.com/a/26419153/7870359 last secret 以获得一个很好的例子。
标签: sql postgresql common-table-expression