【发布时间】:2018-06-18 06:33:53
【问题描述】:
我正在尝试按照我描述的方式更新一棵树。我有一棵深度为 5 的树,叶节点的值大于 0。现在对于每个父节点,我想计算子节点中访问次数最多的值并为自己设置该值。现在我正在尝试这样做:
update itmanagement.PRC_processes parent
set MainStructID = (case when (select MainStructID
from (select * from itmanagement.PRC_processes) child
where parent.ProcessID = child.ParentID
group by MainStructID
order by count(*)
limit 1) is null then 0 else (select MainStructID
from (select * from itmanagement.PRC_processes) child
where parent.ProcessID = child.ParentID
group by MainStructID
order by count(*)
limit 1) end),
SubStructID = (case when (select SubStructID
from (select * from itmanagement.PRC_processes) child
where parent.ProcessID = child.ParentID
group by SubStructID
order by count(*)
limit 1) is null then 0 else (select SubStructID
from (select * from itmanagement.PRC_processes) child
where parent.ProcessID = child.ParentID
group by SubStructID
order by count(*)
limit 1) end)
where ProcessID > 0 and MainStructID = 0 and SubStructID = 0;
但运行上述查询后,没有任何变化。例如,ID 为 ProcessID = 24 的行保留之前的值 0。但下面的查询返回值:
select SubStructID
from (select * from itmanagement.PRC_processes) child
where child.ParentID = 24
group by SubStructID
order by count(*)
limit 1;
我自己的猜测是 select 语句返回一个表(也只有一行),它在赋值中不起作用。
那么问题是什么以及如何解决呢?
【问题讨论】:
-
您需要添加一些示例数据和表格描述,例如作为一个 sql 小提琴。最可能的问题:
MainStructID和SubStructId的当前值是否真的都是0或者可能(至少其中之一)null(在这种情况下,您的查询将不会因为where条件而更新)?此外,您可能需要order by count(*) desc而不是order by count(*)。不相关:您可以使用set MainStructID = coalesce(...,0)而不是set MainStructID = case when ... is null then 0 else ... end(但它不会影响您的问题,只会使您的代码更短)。
标签: mysql select nested sql-update