公共表表达式 (CTE) 是一个临时的、命名的结果集,您可以在 SQL 查询中引用它。它使用 WITH
关键字定义,并且仅在其所属查询的持续时间内存在。 CTE 的作用类似于短期的视图或派生表,允许您将复杂的查询分解为更小、可重用的部分。例如,您可能会创建一个 CTE 来计算聚合数据,然后再将其与主查询中的其他表连接。 CTE 对于提高可读性和简化嵌套子查询特别有用。
CTE 提供两个主要优点:模块化和递归。通过将查询的部分隔离到 CTE 中,您可以更有逻辑地构建代码,从而更容易调试或修改。例如,如果您需要在应用多个转换之前过滤数据集,CTE 可以保存过滤后的数据,后续步骤可以清晰地引用它。递归 CTE 是一种特殊的形式,它通过重复执行查询直到满足条件来查询分层数据(如组织结构图或类别树)。这避免了 SQL 中对过程循环的需求,尽管递归仅在 PostgreSQL、SQL Server 或 Oracle 等数据库中受支持。
为了说明,考虑一个需要计算每个区域的总销售额,然后将每个区域的销售额与平均值进行比较的场景。如果没有 CTE,您可能会嵌套聚合函数或重复计算。使用 CTE,您可以首先在命名块 (WITH region_sales AS (...)
) 中计算总数,然后在主查询中引用它以执行比较。这种方法减少了冗余并保持逻辑集中化。虽然 CTE 并不总是提高性能,但它们的清晰性和可维护性使它们成为组织复杂操作的实用工具,尤其是在处理多步骤数据转换或递归关系时。