合 GreenPlum中的WITH查询(公用表表达式)
简介
WITH子句提供在一个更大的SELECT查询中,使用子查询或执行数据修改操作的方式。你可以在INSERT, UPDATE, 或 DELETE 命令中使用WITH子句。
在WITH子句中的查询 在WITH子句中使用SELECT的相关信息
WITH子句中的数据修改语句, 在WITH子句中使用INSERT, UPDATE, or DELETE
Note: 这些是使用WITH子句的限制。
- 对于包含WITH子句的SELECT命令,该子句最多只能包含一个修改表数据的子句(INSERT, UPDATE, 或 DELETE命令)。
- 对于包含WITH子句的数据修改命令(INSERT, UPDATE, 或 DELETE),该子句只能包含SELECT命令,WITH子句不能包含数据修改命令。
默认情况下,将启用WITH子句的RECURSIVE关键字。通过将服务器配置参数gp“recursive”设置为false,可以禁用递归。By default, the RECURSIVE keyword for the WITH clause is enabled. 通过将服务器配置参数gp_recursive_cte 设置为false,WITH子句的RECURSIVE关键字被禁用。
Parent topic: 查询数据
在WITH子句中的查询
子查询通常被称为公共表表达式或CTE,可以认为是为查询定义临时表。这些示例显示了与SELECT命令一起使用的WITH子句。带WITH子句的示例可以以插入、更新或删除的相同方式使用。在每种情况下,WITH子句都有效地提供了可以在主命令中引用的临时表。
WITH子句中的SELECT命令在每次执行父查询时只计算一次,即使父查询或WITH子句的同级多次引用了该命令。因此,需要在多个地方进行的昂贵计算可以放在WITH子句中,以避免重复工作。另一个可能的应用是防止对具有副作用的函数进行不必要的多次计算。然而,这种情况的另一方面是,与普通的子查询相比,优化器无法将来自父查询的限制向下推送到WITH查询中。 WITH查询通常将按写入方式进行计算,而不禁止父查询随后可能丢弃的行。但是,如果对查询的引用只需要有限的行数,则计算可能会提前停止。
此功能的一个用途是将复杂的查询分解为简单的部分。此示例查询仅在顶部销售区域中显示每个产品的销售总额:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | WITH regional_sales AS ( SELECT region, SUM(amount) AS total_sales FROM orders GROUP BY region ), top_regions AS ( SELECT region FROM regional_sales WHERE total_sales > (SELECT SUM(total_sales)/10 FROM regional_sales) ) SELECT region, product, SUM(quantity) AS product_units, SUM(amount) AS product_sales FROM orders WHERE region IN (SELECT region FROM top_regions) GROUP BY region, product; |
可以不使用WITH子句编写查询,但需要两级嵌套子选择。相比较来说,WITH子句比较容易。
当启用可选RECURSIVE关键字时,WITH子句可以完成标准SQL中不可能完成的事情。使用RECURSIVE,WITH子句中的查询可以引用自己的输出。这是一个简单的例子,它计算从1到100的整数之和: