如何使用窗口函数更新表中的列
Posted
技术标签:
【中文标题】如何使用窗口函数更新表中的列【英文标题】:How to update a column in a table using a window function 【发布时间】:2019-07-02 07:43:24 【问题描述】:我在 MariaDB 中有一张不同节点的表,每个节点可以有多个硬件组件,我想统计每个节点有多少个硬件组件并将其存储在一个列中。
因此,我创建了一个名为“HW_Count”的空列。我可以通过以下 SELECT 语句进行此计算。
SELECT NodeID,COUNT(NodeId) OVER (PARTITION BY NodeId) FROM Hardware AS HW_Count
这将返回以下类型的列表
NodeID HWCount
1 33
1 33
... ...
2 11
2 11
... ...
现在我想用 tihs 信息更新名为 Hardware 的表中的空列,但我不确定如何编写正确的 UPDATE 语句。我想做一些类似的事情
UPDATE Hardware
SET HW_count =
COUNT(NodeId) OVER (PARTITION BY NodeId)
但它会返回
"SQL ERROR (4015): Window function is allowed only in SELECT list and ORDER BY clause".
更新我的专栏的正确方法是什么?
谢谢!
【问题讨论】:
在更新语句SET HW_count = ...
中,HW_count
是你的Hardware
表列之一?
"因此我创建了一个名为 "HW_Count" 的空列 "是的,它是空列。
【参考方案1】:
我找到了答案
UPDATE Hardware, (SELECT NodeID,COUNT(NodeID) AS `HW_Count` FROM
Hardware GROUP BY NodeID) AS dummyTable
SET Hardware.hw_count = Dummytable.Hw_count
WHERE Hardware.NodeID= dummytable.NodeID
【讨论】:
【参考方案2】:请试试这个:
UPDATE H1
SET HW_count = (SELECT COUNT(*) HW_count FROM Hardware WHERE NodeID = H1.NodeID GROUP BY NodeID)
FROM Hardware H1
INNER JOIN Hardware H2 ON H1.NodeID=H2.NodeID
【讨论】:
【参考方案3】:我建议使用 JOIN
和 GROUP BY
来执行此操作:
UPDATE Hardware h JOIN
(SELECT NodeID, COUNT(NodeID) AS new_hw_count
FROM Hardware
GROUP BY NodeID
) hh
ON hh.NodeID = h.NodeID
SET h.hw_count = h.new_hw_count;
【讨论】:
以上是关于如何使用窗口函数更新表中的列的主要内容,如果未能解决你的问题,请参考以下文章
SQL UPDATE - 如何使用另一个表更新一个表中的列?