# 代码审查报告 **文件:** `data\demo-sqlfluff\src\01_aliasing.sql` **语言:** sql **耗时:** 102.5s **分析工具:** sqlfluff --- 总计: 12 | 错误: 10 | 警告: 1 | 建议: 1 静态分析 · 9 个问题 - 🔴 `sqlfluff:AL02` L5 第 5 行:列别名使用隐式/显式混用的别名形式。 建议: 请为列别名显式添加 AS 关键字,例如将 `col1 col1_alias` 改为 `col1 AS col1_alias`。 - 🔴 `sqlfluff:AM05` L20 第 20 行:JOIN 子句应使用完全限定的列引用。 建议: 为每个表使用唯一别名,并确保 ON 条件中的列都以该表别名限定;例如 `ON t1.id = t2.ref_id`,而不是 `other_table.ref_id`。 - 🔴 `sqlfluff:AL04` L21 第 21 行:表别名 't1' 重复使用。表别名应保持唯一。 建议: 将第二张表 other_table 的别名改为唯一别名(如 t2),并同步修改 ON 条件中的引用为 `t1.id = t2.ref_id`。 - 🔴 `sqlfluff:LT02` L21 第 21 行:'ON' 前应换行且不应有缩进。 建议: 将 ON 放到新的行,并不加额外缩进:`other_table AS t1\nON t1.id = other_table.ref_id;` - 🔴 `sqlfluff:AL05` L27 第 27 行:表别名 'unused_alias' 在 SELECT 语句中从未使用。 建议: 移除未使用的表别名,直接使用表名;或若该别名有意义,在查询中引用它。 - 🔴 `sqlfluff:AL08` L32 第 32 行:列别名 'shared_alias' 与第 31 行的别名重复。 建议: 为这两列设置不同的别名,例如将第 32 行的 `name AS shared_alias` 改为 `name AS name_alias`。 - 🔴 `sqlfluff:AL09` L38 第 38 行:列不应使用与列名相同的别名(自别名)。 建议: 移除 `AS id`,直接写 `id`;或改成一个有意义的别名如 `id_alias`。 - 🔴 `sqlfluff:AL10` L46 第 46 行:派生表必须指定别名。 建议: 为子查询添加表别名,例如 `(SELECT COUNT(*) AS cnt FROM my_table) AS cnt_table`。 - 🔴 `sqlfluff:LT12` L47 第 47 行:文件必须以单个尾随换行符结束。 建议: 在文件末尾添加一个换行符,并确保没有多余的空行或行尾空格。 AI 审查 · 3 条建议 - 🔴 [AI] [bug] `invalid-alias-original-table-reference` L21 **ON 条件中混用原始表名与别名** 第 21 行中,`other_table AS t1` 为表设置了别名,但随后 ON 子句使用 `other_table.ref_id` 引用该表。大多数 SQL 方言中,一旦表指定别名,就必须用别名限定列,不能再用原始表名;且该查询还存在重复别名 t1,导致 `t1.id` 指代不明。 建议: 为 other_table 使用唯一别名(如 t2),并将 ON 条件改为 `t1.id = t2.ref_id`,同时保持两个表别名唯一。 - 🟡 [AI] [performance] `redundant-derived-table` L46 **不必要的外层查询嵌套** 第 43-46 行 `SELECT cnt FROM (SELECT COUNT(*) AS cnt FROM my_table)` 先用子查询计算 COUNT(*),再由外层选择 cnt;这层封装没有实际作用,反而让 SQL 更难阅读且可能妨碍优化器简化执行计划。 建议: 直接写成 `SELECT COUNT(*) AS cnt FROM my_table;`,既避免派生表别名问题,也减少不必要的嵌套。 - 🔵 [AI] [style] `missing-column-alias` L11 **聚合列缺少别名** 第 11 行 `SUM(amount)` 没有显式别名,返回列名会依赖具体数据库的默认命名规则,不利于后续代码维护与结果集访问。 建议: 为聚合表达式添加有意义且稳定的别名,例如 `SUM(amount) AS total_amount`。