Sql 对查询操作的理解
我在postgresql指南中看到了这个示例:Sql 对查询操作的理解,sql,postgresql,common-table-expression,Sql,Postgresql,Common Table Expression,我在postgresql指南中看到了这个示例: WITH t AS ( DELETE FROM foo ) DELETE FROM bar; 手册上说: 此示例将删除表foo和bar中的所有行。号码 报告给客户端的受影响行的数量将仅包括行 从吧台上取下 如果我没有“调用”t,为什么它会从foo中删除 通常使用with,如下所示: WITH t AS ( UPDATE products SET price = price * 1.05 RETURNING * ) SELECT
WITH t AS (
DELETE FROM foo
)
DELETE FROM bar;
手册上说:
此示例将删除表foo和bar中的所有行。号码
报告给客户端的受影响行的数量将仅包括行
从吧台上取下
如果我没有“调用”t
,为什么它会从foo
中删除
通常使用with
,如下所示:
WITH t AS (
UPDATE products SET price = price * 1.05
RETURNING *
)
SELECT * FROM t;
有一个对t
的实际调用,该调用只有在块“召唤”
有人能解释一下吗?引用的示例显示,无论是否在主查询中使用,with
子句中的查询都会执行。根据这一原则,您可以在一个查询中执行多个独立的操作。这是一个非常方便的解决方案,极大地扩展了SQL的灵活性
请注意,如果不希望执行查询t
,请不要使用它:
DELETE FROM bar;
如果你用过
WITH t AS (
DELETE FROM foo
)
DELETE FROM bar;
这意味着您的目的是在一个查询中从两个表foo
和bar
中删除行
在中,您可以找到:
如果WITH中的数据修改语句缺少RETURNING子句,则
它不构成临时表,不能在本文档的其余部分中引用
查询。尽管如此,仍将执行这一声明
如果规范中引用了关于与的这种行为的话,这将是很有帮助的(因为目前还不清楚这个答案是基于什么)。@zerkms:文档中的解释与引用的示例相邻……现在是答案:-)所以如果我只使用t AS(从foo中删除)编写
什么也不会发生?正确吗?@UnPeu:不会发生任何事情,因为您将出现语法错误。相关: