跳到内容

公共表表达式

通用表表达式 (CTE) 是 SQL 的一项特性,允许您定义一个可在 SQL 语句中引用的临时命名结果集。CTE 提供了一种将复杂的 SQL 查询分解为更小、更易于管理的部分的方法,使其更易于阅读、编写和维护。

CTE 使用 WITH 关键字定义,后跟逗号分隔的子查询列表,每个子查询都定义了一个可在后续查询中使用的命名结果集。CTE 的语法如下

WITH cte_name AS (
    subquery
)
SELECT ...

在此语法中,cte_name 是 CTE 的名称,而 subquery 是定义结果集的子查询。然后,CTE 可以在后续查询中被引用,就像它是一个表或视图一样。

CTE 在处理涉及多层子查询的复杂查询时特别有用,因为它们允许您将查询分解为更小、更易于理解和调试的部分。此外,CTE 可以通过允许数据库优化和缓存子查询的结果,从而减少其执行次数,帮助提高查询性能。

Polars 支持使用 SQL 语法中的 WITH 子句的通用表表达式 (CTE)。下面是一个示例

register · execute

ctx = pl.SQLContext()
df = pl.LazyFrame(
    {"name": ["Alice", "Bob", "Charlie", "David"], "age": [25, 30, 35, 40]}
)
ctx.register("my_table", df)

result = ctx.execute(
    """
    WITH older_people AS (
        SELECT * FROM my_table WHERE age > 30
    )
    SELECT * FROM older_people WHERE STARTS_WITH(name,'C')
""",
    eager=True,
)

print(result)

shape: (1, 2)
┌─────────┬─────┐
│ name    ┆ age │
│ ---     ┆ --- │
│ str     ┆ i64 │
╞═════════╪═════╡
│ Charlie ┆ 35  │
└─────────┴─────┘

在此示例中,我们使用 SQLContextexecute() 方法执行包含 CTE 的 SQL 查询。该 CTE 从 my_table LazyFrame 中选择 age 列大于 30 的所有行,并将其别名为 older_people。然后我们执行第二个 SQL 查询,该查询从 older_people CTE 中选择 name 列以字母 'C' 开头的所有行。