select语句中的CTE递归查询

时间:2019-05-17 10:04:19

标签: mysql

我有两个MySQL服务器版本8.0,一个用于本地开发,另一个用于Heroku实例,更确切地说,是在Heroku上,我正在使用名为JAWSDB的服务。

对于我的项目,我必须使用以下CTE查询,因为表tree_structure的结构是分层的。

查询的目的是,对于tree_structure中的每一行,我必须获取其所有子级,然后计算该特定行及其子级中user_roles表中有多少用户

SELECT mtr.id,
       mtr.parent_id,
       mtr.name,
       mtr.manager_id,
       CONCAT(users.nome, ' ', users.cognome) as resp_name,
       (
           with recursive cte (id, name, parent_id) as (
               select id,
                      name,
                      parent_id
               from tree_structure as tr_rec
               where tr_rec.parent_id = mtr.id
                 and tr_rec.session_id = '2018'
               union all
               select tr.id,
                      tr.name,
                      tr.parent_id
               from tree_structure as tr
                        inner join cte
                                   on tr.parent_id = cte.id
               WHERE tr.session_id = '2018'
           )
           select count(distinct (user_id))
           from user_roles as ur_count
           where ur_count.structure_id in (select distinct(id) from cte)
       )                                  as utenti
FROM tree_structure as mtr
         LEFT JOIN users ON mtr.manager_id = users.id
WHERE level = 0

问题在于在我的本地服务器上它可以工作,而在heroku实例上却给我以下错误:

unknow columns mtr.id in where clause

有人对导致此错误的原因有任何想法吗?

在此先感谢您的英语不好。

2 个答案:

答案 0 :(得分:0)

CTE中的表引用不明确:

       BacksGas_Flow_sccm ContextID  StepID  Time_Elapsed         Time_ms
104082            1.757812   7325335       3       153.238 08:49:06.900000
205388            1.757812   7324656       2         145.9 07:16:31.660000
105119            1.953125   7290176       1       139.695 09:30:39.170000

表tree_structure用于子选择和最外面的选择。优良作法是为您使用的每个表引用创建唯一的别名。

在这种情况下,您应该输入错字,应该检查层次结构根节点的自引用:

SELECT 
  ....   
    (with recursive cte (id, name, parent_id) as (
     ....
       from tree_structure as tr_rec        -- here you have aliased the table
      where tr_rec.id = tree_structure.id  -- here you refer to the table and its alias
        and tr_rec.session_id = '2018'
      union all
      ....
    )
    ....
 ) as utenti
....

答案 1 :(得分:0)

好的,我发现了查询错误的原因。显然,从MySQL 8.0.14版本开始,他们引入了对在子查询中使用外部参数的支持。

我的本​​地版本是8.0.16,而在线版本是8.0.11,因此,因此我的查询无法正常工作。