我在postgresql指南中看到了这个例子:
WITH t AS (
DELETE FROM foo
)
DELETE FROM bar;
手册说:
此示例将删除表foo和bar中的所有行。数字 报告给客户端的受影响行仅包含行 从酒吧搬走。
如果我没有“呼叫”foo
,为什么会从t
删除?
Normaly with
的用法如下:
WITH t AS (
UPDATE products SET price = price * 1.05
RETURNING *
)
SELECT * FROM t;
有t
的实际呼叫,然后“召唤”with
阻止。
有人可以解释一下吗?
答案 0 :(得分:2)
引用的示例显示with
子句中的查询是否执行,无论它是否在主查询中使用。使用此原则,您可以在单个查询中执行多个独立操作。这是一个非常方便的解决方案,极大地扩展了SQL的灵活性。
请注意,如果您不希望执行查询t
,请不要使用它:
DELETE FROM bar;
如果您已经使用过
WITH t AS (
DELETE FROM foo
)
DELETE FROM bar;
这意味着您的目的是在一个查询中从表foo
和bar
中删除行。
在the documentation中,您可以找到:
如果WITH中的数据修改语句缺少RETURNING子句,那么 它不构成临时表,在其余部分不能引用 查询。尽管如此,这样的陈述仍将被执行。