繁体   English   中英

如何从另一个表更新表,有 2 列

[英]How to update table from another table, with 2 columns

我正在使用 SQL 服务器数据库并想要一种更新MachinesSummary.ShareCount的方法。

这是我的两张桌子

Machines总结

ID Machine1 Machine2 ShareCount
-------------------------------
1  A        J        NULL
2  K        S        NULL
3  A        E        NULL
4  J        A        NULL
5  Y        U        NULL
6  S        W        NULL
7  G        A        NULL
8  W        S        NULL

另一张表是MachineDetails

ProcessNo Machine
------------------
1         A
1         H
1         W
2         A
2         J
2         W
3         Y
3         K
4         J
4         A

我想用Machine1Machine2共享的进程数更新MachineSummary表中的ShareCount

对于MachineSummary表中的记录1 ,我希望在MachineDetails中共享的进程数在本例中为1

而对于记录4ShareCount2

我试过这个

UPDATE M
SET ShareCount = COUNT(DISTINCT X.ProcessNo)
FROM 
    (SELECT ProcessNo, ',' + STRING_AGG(Machine,',') + ',' Machines
     FROM MachineDetails
     GROUP BY ProcessNo) X 
INNER JOIN MachinesSummary M ON X.Machines LIKE '%'+ M.Machine1 + '%' 
                             AND X.Machines LIKE '%'+ M.Machine2 + '%' 

但我想知道是否有更简单的高性能方式

MachineDetails表有 2.5 亿行。

好吧,我会使用self-join来获取组合的数量:

UPDATE M
    SET ShareCount = num_processes
FROM MachinesSummary M JOIN
     (SELECT md1.Machine as machine1, md2.Machine as machine2, COUNT(*) as num_processes
      FROM MachineDetails md1 JOIN
           MachinesDetails md2
           ON md1.processno = md2.processno
      GROUP BY md1.Machine, md2.Machine
     ) md
     ON md.Machine1 = M.machine1 AND md.Machine2 = M.machine2;

我会在这里使用可更新的 CTE:

WITH cte AS (
    SELECT Machine, COUNT(*) AS cnt
    FROM MachineDetails
    GROUP BY Machine
),
cte2 AS (
    SELECT ShareCount, COALESCE(t1.cnt, 0) AS m1_cnt, COALESCE(t2.cnt, 0) AS m2_cnt
    FROM MachineSummary ms
    LEFT JOIN cte t1 ON t1.Machine1 = ms.Machine
    LEFT JOIN cte t2 ON t2.Machine2 = ms.Machine
)

UPDATE cte2
SET ShareCount = m1_cnt + m2_cnt;

第一个涉及MachineDetails表的 CTE 的逻辑是获取每台机器的计数。 第二个 CTE 将此计数 CTE 加入MachineSummary表两次,机器 1 和 2 各一次。然后,我们更新此第二个 CTE 并分配计数总和。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM