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

SQLFluff报AM06错误:DBT中ORDER BY子句列引用不一致问题排查

关于DBT代码中SQLFluff抛出AM06错误的问题解析

问题描述

我无法理解为何在DBT代码中仅包含如下ORDER BY子句时,SQLFluff会抛出AM06错误(GROUP BY/ORDER BY子句中列引用不一致)。代码如下:

with table2 as (

    select
        h.id,
        h.id2
    from table3 as h
    order by
        h.parentid asc,
        h.createddate asc

)

select
    s.id,
    p.id
from table1 as s
left join table2 as p on p.id = s.parentid
order by
    p.shop_id asc,
    p.supplier_id asc,
    p.supplier_configuration_number asc,
    s.createddate asc,
    s.id asc

问题原因

SQLFluff的AM06规则核心是检查ORDER/GROUP BY子句中引用的列,是否在当前查询的SELECT列表(或GROUP BY分组列,若存在分组)范围内,你的代码存在两处违反该规则的情况:

  1. CTE table2中的无效ORDER BY
    CTE里的ORDER BY引用了h.parentid和h.createddate,但该CTE的SELECT列表只包含id和id2,未包含这两列。除了搭配LIMIT的场景外,数据库引擎通常会忽略CTE内部的ORDER BY(因为CTE是临时结果集,本身不保证排序),同时SQLFluff会判定这种引用未被选中列的行为属于"列引用不一致"。

  2. 主查询ORDER BY引用不存在的列
    主查询里用p.shop_id、p.supplier_id、p.supplier_configuration_number排序,但p对应的是table2,而table2的SELECT列表只有id和id2,根本没有这些列。这种引用不存在列的行为也会触发AM06错误。

修复方案

  • 针对CTE table2:
    • 如果后续逻辑需要用到parentid或createddate,将这两列加入CTE的SELECT列表;
    • 如果CTE内的ORDER BY是多余的(没有搭配LIMIT),直接删除该ORDER BY子句。
  • 针对主查询的ORDER BY:
    • 若shop_id等列来自table3,将它们加入table2的SELECT列表;
    • 若逻辑上这些列应该来自table1,则修正引用为s.shop_id等;
    • 若排序逻辑有误,直接替换为table2或table1中实际存在的列。

内容的提问来源于stack exchange,提问作者Piotr K

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 02:20:04