``` -- 各个国家项目数量分布 /* SELECT count(distinct project_code) as project_count, country FROM view.ic_dev15oc_mart.ads_oo_po_vehicle_model_state_bi GROUP BY country */ -- select id,code,name,level,parent_id,help_sort FROM view.ic_dev15oc_mart.view_dwd_plm_imp_plm_pm_prj_t_17010_hw_dev15oc_1054010535 -- where parent_id='2091924844666945548' -- where level= 5 /* -- RECURSIVE WITH RECURSIVE hierarchy AS ( SELECT id, parent_id, level, CAST(ROW_NUMBER() OVER (ORDER BY id) AS STRING) as base_num, id as root_id FROM view.ic_dev15oc_mart.view_dwd_plm_imp_plm_pm_prj_t_17010_hw_dev15oc_1054010535 WHERE level = 1 UNION ALL SELECT t.id, t.parent_id, t.level, CONCAT( h.base_num, '.', CAST(ROW_NUMBER() OVER ( PARTITION BY t.parent_id ORDER BY t.id ) AS STRING) ), h.root_id FROM view.ic_dev15oc_mart.view_dwd_plm_imp_plm_pm_prj_t_17010_hw_dev15oc_1054010535 t INNER JOIN hierarchy h ON t.parent_id = h.id AND t.level = h.level + 1 ) SELECT id, parent_id, level, base_num as multilevel_num FROM hierarchy ORDER BY root_id, multilevel_num */ /* WITH sorted_hierarchy AS ( SELECT id, parent_id, level FROM view.ic_dev15oc_mart.view_dwd_plm_imp_plm_pm_prj_t_17010_hw_dev15oc_1054010535 ) SELECT l1.id AS level1_id, l2.id AS level2_id, l3.id AS level3_id, l4.id AS level4_id, l5.id AS level5_id FROM (SELECT * FROM sorted_hierarchy WHERE level = 1) l1 LEFT JOIN (SELECT * FROM sorted_hierarchy WHERE level = 2) l2 ON l1.id = l2.parent_id LEFT JOIN (SELECT * FROM sorted_hierarchy WHERE level = 3) l3 ON l2.id = l3.parent_id LEFT JOIN (SELECT * FROM sorted_hierarchy WHERE level = 4) l4 ON l3.id = l4.parent_id LEFT JOIN (SELECT * FROM sorted_hierarchy WHERE level = 5) l5 ON l4.id = l5.parent_id -- ORDER BY l1.rank_in_level, l2.rank_in_level ,l3.rank_in_level, l4.rank_in_level,l5.rank_in_level; */ SELECT l1.id AS level1_id, l1.rank AS rank1, l2.id AS level2_id, l2.level AS level2, l2.help_sort AS help_sort2, l2.order AS order2, l3.id AS level3_id, l3.level AS level3, l3.help_sort AS help_sort3, l3.order AS order3, l4.id AS level4_id, l4.level AS level4, l4.help_sort AS help_sort4, l4.order AS order4, l5.id AS level5_id, l5.level AS level5, l5.help_sort AS help_sort5 l5.order AS order5, FROM (SELECT id,parent_id,help_sort, ROW_NUMBER() OVER (ORDER BY id ASC) AS rank FROM view.ic_dev15oc_mart.view_dwd_plm_imp_plm_pm_prj_t_17010_hw_dev15oc_1054010535 WHERE level = 1 ) l1 LEFT JOIN (SELECT id,parent_id,level,help_sort,ROW_NUMBER() OVER (PARTITION BY parent_id ORDER BY help_sort ASC) AS order FROM view.ic_dev15oc_mart.view_dwd_plm_imp_plm_pm_prj_t_17010_hw_dev15oc_1054010535 WHERE level = 2) l2 ON l1.id = l2.parent_id LEFT JOIN (SELECT id,parent_id,level,help_sort,ROW_NUMBER() OVER (PARTITION BY parent_id ORDER BY help_sort ASC) AS order FROM view.ic_dev15oc_mart.view_dwd_plm_imp_plm_pm_prj_t_17010_hw_dev15oc_1054010535 WHERE level = 3) l3 ON l2.id = l3.parent_id LEFT JOIN (SELECT id,parent_id,level,help_sort,ROW_NUMBER() OVER (PARTITION BY parent_id ORDER BY help_sort ASC) AS order FROM view.ic_dev15oc_mart.view_dwd_plm_imp_plm_pm_prj_t_17010_hw_dev15oc_1054010535 WHERE level= 4) l4 ON l3.id = l4.parent_id LEFT JOIN (SELECT id,parent_id,level,help_sort,ROW_NUMBER() OVER (PARTITION BY parent_id ORDER BY help_sort ASC) AS order FROM view.ic_dev15oc_mart.view_dwd_plm_imp_plm_pm_prj_t_17010_hw_dev15oc_1054010535 WHERE level = 5) l5 ON l4.id = l5.parent_id order by rank1, level2,help_sort2,level3,help_sort3, level4,help_sort4, level5,help_sort5```line 8:7 cannot recognize input near 'l2' '.' 'order' in selection target
时间: 2025-07-13 07:43:26 浏览: 4
<think>嗯,用户提供的SQL查询在第八行遇到了一个错误:“line 8:7 cannot recognize input near 'l2' '.' 'order' in selection target”。我需要仔细看看这个查询哪里出错了。
首先,先看一下整个查询的结构。这是一个多级联表查询,使用了多个LEFT JOIN来连接不同层级的表。每个子查询都选取了id、parent_id、help_sort,并且使用ROW_NUMBER()生成序号。然后,主查询部分试图选择各个层级的id和一些排序字段,比如help_sort和order。
注意到错误发生在第8行,具体是“l2.order AS order2”附近。可能的问题点有几个:
1. **保留字冲突**:`order`是SQL的关键字,通常用于ORDER BY子句。如果在列别名或列名中直接使用,而没有正确转义,会导致语法错误。比如,当用户写“l2.order AS order2”时,如果`order`作为列名没有用反引号或引号包裹,解析器会误认为是关键字,从而报错。
2. **列名不存在**:检查子查询中的列是否确实有名为`order`的列。例如,在子查询l2中,用户使用了“ROW_NUMBER() ... AS order”,这里生成的别名是order,但由于order是关键字,可能在生成时就需要转义,否则子查询的结果可能无法正确传递到外层。
3. **语法错误**:在最后的SELECT部分,可能缺少逗号或其他符号。例如,在“l5.help_sort5”和“l5.order AS order5”之间缺少逗号,这会导致后续的解析错误,进而引发问题。
现在逐一核对:
- 在子查询l2中,用户确实有“ROW_NUMBER() OVER (...) AS order”。这里使用order作为别名,但未转义。在大多数SQL方言中,使用保留字作为别名需要用反引号或双引号包裹,比如AS `order`或AS "order"。如果未转义,会导致语法错误。
- 主查询中,l5的help_sort5后面是否有逗号?查看用户代码的SELECT部分:
```
l5.help_sort5
l5.order AS order5,
```
这里在l5.help_sort5之后没有逗号,直接换行写l5.order,导致语法错误。应该改为:
```
l5.help_sort5,
l5.order AS order5,
```
缺少逗号会导致解析器认为这两行是连续的,从而出现无法识别的符号。
因此,错误的主要原因有两个:
1. 在子查询中使用`order`作为别名时未转义,导致关键字冲突。
2. 在SELECT列表的最后部分缺少逗号,导致语法错误。
解决方案应该是:
- 将所有作为别名的`order`用反引号或双引号包裹,例如:AS `order`。
- 在l5.help_sort5后面添加逗号,确保语法正确。
此外,还需要检查其他层级的子查询是否存在相同的问题,例如l3、l4中的order别名是否也需转义,以及主查询中的各个字段之间是否都有逗号分隔。
总结,用户需要修正列别名的命名,避免使用保留字,并在适当的位置添加逗号以修复语法错误。</think>您提供的SQL查询存在语法错误,具体分析如下:
---
### 错误原因分析
**错误提示**:`line 8:7 cannot recognize input near 'l2' '.' 'order' in selection target`
**主要原因**:
1. **保留字冲突**:`order`是SQL的保留关键字,不能直接作为列名或别名使用
2. **字段引用错误**:在多层JOIN时未正确处理字段命名
3. **缺少逗号**:第5级字段定义后缺少逗号
---
### 修正后的完整SQL
```sql
SELECT
l1.id AS level1_id,
l1.rank AS rank1,
l2.id AS level2_id,
l2.level AS level2,
l2.help_sort AS help_sort2,
l2.order_column AS order2, -- 修改点1:重命名保留字
l3.id AS level3_id,
l3.level AS level3,
l3.help_sort AS help_sort3,
l3.order_column AS order3, -- 修改点2
l4.id AS level4_id,
l4.level AS level4,
l4.help_sort AS help_sort4,
l4.order_column AS order4, -- 修改点3
l5.id AS level5_id,
l5.level AS level5,
l5.help_sort AS help_sort5, -- 修改点4:添加缺失的逗号
l5.order_column AS order5
FROM
(SELECT id,parent_id,help_sort, ROW_NUMBER() OVER (ORDER BY id ASC) AS rank
FROM view.ic_dev15oc_mart.view_dwd_plm_imp_plm_pm_prj_t_17010_hw_dev15oc_1054010535
WHERE level = 1 ) l1
LEFT JOIN
(SELECT id,parent_id,level,help_sort,
ROW_NUMBER() OVER (PARTITION BY parent_id ORDER BY help_sort ASC) AS order_column -- 修改点5
FROM view.ic_dev15oc_mart.view_dwd_plm_imp_plm_pm_prj_t_17010_hw_dev15oc_1054010535
WHERE level = 2) l2
ON l1.id = l2.parent_id
LEFT JOIN
(SELECT id,parent_id,level,help_sort,
ROW_NUMBER() OVER (PARTITION BY parent_id ORDER BY help_sort ASC) AS order_column -- 修改点6
FROM view.ic_dev15oc_mart.view_dwd_plm_imp_plm_pm_prj_t_17010_hw_dev15oc_1054010535
WHERE level = 3) l3
ON l2.id = l3.parent_id
LEFT JOIN
(SELECT id,parent_id,level,help_sort,
ROW_NUMBER() OVER (PARTITION BY parent_id ORDER BY help_sort ASC) AS order_column -- 修改点7
FROM view.ic_dev15oc_mart.view_dwd_plm_imp_plm_pm_prj_t_17010_hw_dev15oc_1054010535
WHERE level= 4) l4
ON l3.id = l4.parent_id
LEFT JOIN
(SELECT id,parent_id,level,help_sort,
ROW_NUMBER() OVER (PARTITION BY parent_id ORDER BY help_sort ASC) AS order_column -- 修改点8
FROM view.ic_dev15oc_mart.view_dwd_plm_imp_plm_pm_prj_t_17010_hw_dev15oc_1054010535
WHERE level = 5) l5
ON l4.id = l5.parent_id
ORDER BY rank1, level2, help_sort2, level3, help_sort3, level4, help_sort4, level5, help_sort5;
```
---
### 主要修改点说明
1. **保留字处理**:将 `order` 重命名为 `order_column`
2. **字段分隔符**:在 `l5.help_sort5` 后添加缺失的逗号
3. **别名统一**:所有层级的排序字段统一使用 `order_column` 命名
4. **可读性优化**:增加换行和缩进,提升代码可维护性
---
### 查询功能说明
这是一个典型的**多层级项目结构查询**,通过递归JOIN实现了:
1. 项目层级展开(1级到5级)
2. 基于 `help_sort` 字段的层级内排序
3. 使用 `ROW_NUMBER()` 生成层级内序号
4. 最终输出包含完整层级路径的树形结构数据
建议在Hive/Spark等大数据平台运行该查询,注意确保表路径 `view.ic_dev15oc_mart` 的有效性。
阅读全文
相关推荐


















