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分组列,若存在分组)范围内,你的代码存在两处违反该规则的情况:
CTE
table2中的无效ORDER BY
CTE里的ORDER BY引用了h.parentid和h.createddate,但该CTE的SELECT列表只包含id和id2,未包含这两列。除了搭配LIMIT的场景外,数据库引擎通常会忽略CTE内部的ORDER BY(因为CTE是临时结果集,本身不保证排序),同时SQLFluff会判定这种引用未被选中列的行为属于"列引用不一致"。主查询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
相关产品推荐
相关产品推荐

