You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用sqlglot的AST API构建标准WITH别名AS格式的CTE?

使用sqlglot构建标准CTE的常见问题与解决方案

问题场景

我尝试用sqlglot Python库构建标准通用表表达式(CTE):

WITH A AS (
    SELECT * FROM my_table
)
SELECT * FROM A

原实现代码:

from sqlglot import exp, parse_one

cte_select = (
    exp.select("*")
    .from_("my_table")
)

cte_a = exp.Alias(
    this=exp.Subquery(this=cte_select),
    alias=exp.to_identifier("A")
)

query = exp.With(
    expressions=[cte_a],
    this=exp.select("*").from_("A")
)

print(query.sql(pretty=True))

预期输出:

WITH A AS (
  SELECT *
  FROM my_table
)
SELECT *
FROM A

但实际偶尔会生成不符合标准的SQL:

WITH (
  SELECT *
  FROM my_table
) AS A

这种格式会触发sqlglot的"CTE must have alias"错误。


1. 正确构建标准CTE的方法

使用sqlglot专门为CTE设计的exp.CTE类定义CTE条目,而非通用的exp.Alias,能确保生成alias AS (subquery)的标准格式:

from sqlglot import exp

# 定义CTE子查询
cte_select = exp.select("*").from_("my_table")
# 用exp.CTE创建合法CTE条目
cte_a = exp.CTE(alias=exp.to_identifier("A"), this=cte_select)
# 构建最终查询
query = exp.With(expressions=[cte_a], this=exp.select("*").from_("A"))

print(query.sql(pretty=True))

或者使用更简洁的链式便捷API,内部会自动处理CTE节点的正确构造:

query = exp.with_("A", exp.select("*").from_("my_table")).select("*").from_("A")
print(query.sql(pretty=True))

2. 常见陷阱

  • 误用exp.Alias替代exp.CTE:exp.Alias是通用别名节点,适用于列、表的别名场景,并非为CTE设计,会导致生成(subquery) AS alias的反向格式,不符合CTE标准语法。
  • 冗余手动嵌套exp.Subquery:将exp.Select实例直接传给exp.CTE的this参数时,sqlglot会自动包装为子查询,手动创建exp.Subquery可能引发语法生成异常。
  • 错误使用.subquery("A"):对select调用.subquery("A")得到的是带别名的子查询节点,而非CTE条目,传入exp.With的expressions列表会生成错误格式:
    # 错误示例
    wrong_cte = exp.select("*").from_("my_table").subquery("A")
    query = exp.With(expressions=[wrong_cte], this=exp.select("*").from_("A"))
    

3. 最小可运行示例

以下是最简的合法CTE生成代码,利用sqlglot便捷API避免手动AST节点构造的错误:

from sqlglot import exp

# 链式构建CTE与主查询
query = exp.with_("A", exp.select("*").from_("my_table")).select("*").from_("A")

# 输出格式化后的标准SQL
print(query.sql(pretty=True))

运行后输出:

WITH A AS (
  SELECT *
  FROM my_table
)
SELECT *
FROM A

内容的提问来源于stack exchange,提问作者Carlos Oswaldo Alfaro He Him

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 20:22:35