Files
2026Technology-Competition/data/demo-sqlfluff/reports/02_ambiguity-review.md
T
范智鹏 c92249a044 docs: 归档 demo 工程样例与插件实测报告
- 新增三个 demo 工程(demo-eslint / demo-sqlfluff / demo-stylelint):各含 src/ 样例代码与覆盖率映射(run-coverage.mjs、coverage_map.json、stylelint_line_map.json)

- 归档各 demo 的插件实测导出报告(reports/):

  - demo-eslint:common.js / esm-demo.js / legacysyntax.cjs / typescript.ts 审查报告 + 覆盖率报告(292/292 条零偏差,126 种规则全覆盖)

  - demo-sqlfluff:11 个 SQL 样例审查报告 + 覆盖率报告(113/113 条零偏差,57 种规则全覆盖,含 JJ01 行号缺陷修复后的复测验证)

  - demo-stylelint:common.css / empty-source.css 审查报告 + 覆盖率报告(145/145 条零偏差,68 种规则全覆盖)
2026-08-25 22:00:19 +08:00

4.4 KiB

代码审查报告

文件: 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),这些注释就不再准确,会误导后续阅读者。 建议: 在应用修复后同步更新或删除对应注释;或将原始违规样例与修复后样例分开存放,并注明预期触发的规则。