我正在阅读这个页面(关于在SQL中管理分层数据的优秀文章)并跟随MySQL,并试图运行这个SQL片段。

WHILE EXISTS (SELECT * FROM Tree WHERE Depth Is Null)
UPDATE T SET T.depth = P.Depth + 1,
T.Lineage = P.Lineage + Ltrim(Str(T.ParentNode,6,0)) + '/'
FROM Tree AS T
INNER JOIN Tree AS P ON (T.ParentNode=P.Node)
WHERE P.Depth>=0
AND P.Lineage Is Not Null
AND T.Depth Is Null

但我得到以下错误:
您的SQL语法中有一个错误;该错误似乎出现在:
'WHILE EXISTS(从深度为空的树中选择*)UPDATE'at
第1行
我试过从https://www.sqlteam.com/articles/more-trees-hierarchies-in-sql中的建议中添加BEGINENDEND WHILE等,但仍然无法工作。
您可以尝试在一个SQL验证器中运行上面的代码片段(While exists in mysql是一个很好的免费在线代码片段)并看到错误。
我在寻找关于为什么上面的代码片段在博客中不起作用的建议/什么可以被改变从而获得相同的结果。
更新-添加更多数据
感谢@danblack建议添加更多数据以使其成为可验证的示例。
我的当前表
Node    ParentNode  EmployeeID  Depth   Lineage
100     NULL        1001        0       /
101     100         1002        NULL    NULL
102     101         1003        NULL    NULL
103     102         1004        NULL    NULL
104     102         1005        NULL    NULL
105     102         1006        NULL    NULL

代码片段运行后的外观
Node    ParentNode  EmployeeID  Depth   Lineage
100     NULL        1001        0       /
101     100         1002        1       /100/
102     101         1003        2       /100/101/
103     102         1004        3       /100/101/102/
104     102         1005        3       /100/101/102/
105     102         1006        3       /100/101/102/

@丹布莱克指出,这段代码是Microsoft SQL,而不是MySQL,应该使用递归CTE来实现这一点。这是我的尝试,但我还是搞不清楚。
;WITH user_count
AS
(
SELECT * FROM Tree WHERE Depth Is Null AS null_users
UNION ALL
WHILE EXISTS ()
UPDATE T SET T.depth = P.Depth + 1,
T.Lineage = P.Lineage + Ltrim(Str(T.ParentNode,6,0)) + '/'
FROM Tree AS T
INNER JOIN Tree AS P ON (T.ParentNode=P.Node)
WHERE P.Depth>=0
AND P.Lineage Is Not Null
AND T.Depth Is Null
)

最佳答案

在MySQL-8.0中:

select version();

| version() |
| :-------- |
| 8.0.13    |

mysql8.0 db<>fiddle here

MariaDB does not yet supported UPDATE in CTEs

However it can be performed with a temporary table like:

SELECT * from tree

节点`124;父节点`1244EmployeeID`124;深度`1244;沿袭
-……1244年;————……1244年-----------------------------
100`124;0`124;1001`124;0`1244/
101`124;100`124;1002`124;1`124;100/
102`124;101`124;1003`124;2`124;100/101/
103`124;102`1244;1004`124;3`124;100/101/102/
104`124;102`124;1005`124;3`124;100/101/102/
105`124;102`124;1006`124;3`124;100/101/102/
MariaDB-10.3 db<>fiddle here

关于mysql - MySQL-代码段中存在的内容会引发错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54583713/

10-09 04:34