了解使用查询操作

时间:2015-08-23 10:13:35

标签: sql postgresql common-table-expression

我在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阻止。

有人可以解释一下吗?

1 个答案:

答案 0 :(得分:2)

引用的示例显示with子句中的查询是否执行,无论它是否在主查询中使用。使用此原则,您可以在单个查询中执行多个独立操作。这是一个非常方便的解决方案,极大地扩展了SQL的灵活性。

请注意,如果您不希望执行查询t,请不要使用它:

 DELETE FROM bar;

如果您已经使用过

 WITH t AS (
 DELETE FROM foo
 )
 DELETE FROM bar;

这意味着您的目的是在一个查询中从表foobar中删除行。

the documentation中,您可以找到:

  

如果WITH中的数据修改语句缺少RETURNING子句,那么   它不构成临时表,在其余部分不能引用   查询。尽管如此,这样的陈述仍将被执行。