# 代码审查报告 **文件:** `data\demo-sqlfluff\src\02_ambiguity.sql` **语言:** sql **耗时:** 182.4s **分析工具:** sqlfluff --- 总计: 13 | 错误: 10 | 警告: 2 | 建议: 1 静态分析 · 10 个问题 - 🔴 `sqlfluff:AM01` L6 第 6 行:在带有 GROUP BY 的 SELECT 语句中使用 DISTINCT 含义模糊。 建议: 去掉 DISTINCT 或 GROUP BY 中的一个。若只需按 dept、region 去重,可保留 GROUP BY 并去掉 DISTINCT;若不需要分组聚合,则保留 DISTINCT 并去掉 GROUP BY。 - 🔴 `sqlfluff:AM02` L20 第 20 行:建议使用 UNION DISTINCT 或 UNION ALL,而不是裸 UNION。 建议: 根据语义选择:若希望保留所有重复行,把 UNION 改为 UNION ALL;若希望去重,改为 UNION DISTINCT(需方言支持,如 ansi/bigquery/mysql)。 - 🔴 `sqlfluff:AM03` L32 第 32 行:ORDER BY 子句含义模糊;ORDER BY 应对所有列都指定排序方向,或所有列都不指定。 建议: 若只想让 a 升序、b 降序,显式写为 ORDER BY a ASC, b DESC;如果想让两列都降序,则写为 ORDER BY a DESC, b DESC。 - 🔴 `sqlfluff:AM05` L42 第 42 行:JOIN 子句应使用完整限定形式。 建议: 将 JOIN 改为 INNER JOIN(或根据语义使用 LEFT/RIGHT/FULL JOIN),明确连接类型。 - 🔴 `sqlfluff:LT02` L43 第 43 行:'ON' 前应有换行,且 'ON' 前不要有缩进。 建议: 把 ON 子句放到新行,并确保 ON 前没有额外缩进,例如:JOIN other_table AS b ON a.id = b.id; - 🔴 `sqlfluff:AM06` L54 第 54 行:GROUP BY 与 ORDER BY 中的列引用方式不一致。 建议: 统一引用方式:要么都使用列名(GROUP BY a, b 和 ORDER BY a, b),要么都使用序号(GROUP BY 1, 2 和 ORDER BY 1, 2);推荐使用列名,避免 SELECT 列表变化时失效。 - 🔴 `sqlfluff:AM05` L63 第 63 行:JOIN 子句应使用完整限定形式。 建议: 若确实要交叉连接,显式写 CROSS JOIN;若本意是内连接,请补充 ON 条件并写 INNER JOIN。 - 🔴 `sqlfluff:AM08` L63 第 63 行:检测到隐式交叉连接(JOIN 缺少 ON 条件)。 建议: 如果意图是笛卡尔积,请显式写 CROSS JOIN;如果本意是按某列关联,请补上 ON 连接条件。 - 🔴 `sqlfluff:AL05` L64 第 64 行:别名 'b' 在 SELECT 语句中从未被使用。 建议: 移除未使用的别名 b;若后续需要引用 other_table 的列,请使用 b.列名。 - 🔴 `sqlfluff:LT12` L65 第 65 行:文件必须以单个尾随换行符结束。 建议: 在文件末尾保留且仅保留一个换行符,不要有多余空行或缺少换行。 AI 审查 · 3 条建议 - 🟡 [AI] [design] `dialect-dependent-lint-config` L2 **AM02 规则受方言门控,默认配置下会漏报** 顶部注释说明 AM02 仅对 ansi/bigquery/mysql 等支持 UNION DISTINCT 的方言生效,默认方言 oracle 不在白名单。如果 CI 使用默认 SQLFluff 配置,即使启用所有规则也不会报告第 20 行的裸 UNION,可能造成本地与 CI 的检查结果不一致。 建议: 在项目 .sqlfluff 中显式设置目标方言(例如 ansi),并确保本地与 CI 使用同一配置;如果目标方言确为 oracle,应关闭或忽略 AM02。 - 🟡 [AI] [bug] `unnecessary-cartesian-join` L63 **最终查询的交叉连接可能完全是多余连接,产生重复和错误结果** 第 59-64 行 SELECT a.id 只引用了 my_table 的别名 a,却对 other_table 做无 ON 条件的 JOIN(隐式交叉连接)。只要 other_table 非空,每个 a.id 会被重复 other_table 行数次;若 other_table 为空,查询反而返回空集。这通常不是预期语义,也会带来不必要的笛卡尔积开销。 建议: 如果只想返回 my_table 的所有 id,直接删除 JOIN other_table;如果只想返回在 other_table 中有匹配的 id,应使用 INNER JOIN ... ON 并配合 SELECT DISTINCT 或 EXISTS,避免重复。 - 🔵 [AI] [design] `stale-rule-comments` L14 **修复后示例注释将与 SQL 语义不一致** 代码中的 -- AM01、-- AM02 等注释标记的是静态分析规则样例。一旦按上述建议应用修复(例如删除 DISTINCT、把 UNION 改为 UNION ALL、把 JOIN 改为 INNER JOIN/CROSS JOIN),这些注释就不再准确,会误导后续阅读者。 建议: 在应用修复后同步更新或删除对应注释;或将原始违规样例与修复后样例分开存放,并注明预期触发的规则。