我正在阅读这个页面(关于在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中的建议中添加
BEGIN
、END
、END 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 |
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/