Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 对查询操作的理解_Sql_Postgresql_Common Table Expression - Fatal编程技术网

Sql 对查询操作的理解

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

我在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 * 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:不会发生任何事情,因为您将出现语法错误。相关: