2

我需要在 MySQL 中重写一个查询,该查询最初是使用该WITH子句在 MS SQL Server 中编写的。这基本上是为了获取子记录的所有级别的父记录。这里,我以Oracle数据库EMPLOYEES中的schema的经典表HR为例。

表中的原始数据EMPLOYEES就是这种格式。

select employee_id, manager_id
from employees
order by 1,2;

---------------------------------------------
EMPLOYEE_ID            MANAGER_ID             
---------------------- ---------------------- 
100                                           
101                    100                    
102                    100                    
103                    102                    
104                    103                    
107                    103                    
124                    100                    
141                    124                    
142                    124                    
143                    124                    
144                    124                    
149                    100                    
174                    149                    
176                    149                    
178                    149                    
200                    101                    
201                    100                    
202                    201                    
205                    101                    
206                    205

我的要求是查看子记录的所有级别的父记录。我可以使用 Oracle 和 MS SQL Server 中的以下查询来实现这一点。

WITH Asd(Child,
     Parent
    )
AS (SELECT Employee_Id,
           Manager_Id
      FROM Employees
    UNION ALL
    SELECT E.Employee_Id,
           A.Parent
      FROM Employees E, Asd A
      WHERE E.Manager_Id = A.Child
   )
SELECT Child,
       Parent
  FROM Asd
  WHERE Parent IS NOT NULL
  ORDER BY Child, Parent;

----------------------------------------------------------
CHILD                  PARENT                 
---------------------- -----------------------------------
101                    100                    
102                    100                    
103                    100                    
103                    102                    
104                    100                    
104                    102                    
104                    103                    
107                    100                    
107                    102                    
107                    103                    
124                    100                    
141                    100                    
141                    124                    
142                    100                    
142                    124                    
143                    100                    
143                    124                    
144                    100                    
144                    124                    
149                    100                    
174                    100                    
174                    149                    
176                    100                    
176                    149                    
178                    100                    
178                    149                    
200                    100                    
200                    101                    
201                    100                    
202                    100                    
202                    201                    
205                    100                    
205                    101                    
206                    100                    
206                    101                    
206                    205                    

36 rows selected

如您所见,我将所有父母以及祖父母都放在查询中的 PARENT 列下。

但是,这种方法在 MySQL 中不起作用,因为不支持 WITH 子句。谁能帮助我如何在 MySQl 中重写这个查询?

4

1 回答 1

0

至于 2012 年 9 月,在 MySQL 上没有直接替代 MS SQL Server 的公用表表达式 (CTE)。您应该依赖存储过程。

在 SO 中检查这个对另一个相同问题的答案。它应该回答你所有的疑问。我没有复制任何代码,因为链接上的所有内容都非常详细和解释。

于 2012-09-25T11:44:32.233 回答