如何使用窗口函数更新表中的列

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】:

我建议使用 JOINGROUP 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;

【讨论】:

以上是关于如何使用窗口函数更新表中的列的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Laravel 使用视图中的函数更新数据库中的列

如何使用同一表中的列进行更新(ORACLE)

SQL UPDATE - 如何使用另一个表更新一个表中的列?

如何使用 Amazon Redshift 中的临时表列更新现有表中的列?

如何优化查询以使用oracle中另一个表中的列更新表列

如何使用计数查询来(自动)更新表中的列