![](/img/trans.png)
[英]How to update all columns and rows from another table with a stored procedure
[英]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
我想用Machine1
和Machine2
共享的进程数更新MachineSummary
表中的ShareCount
。
对于MachineSummary
表中的记录1 ,我希望在MachineDetails
中共享的进程数在本例中为1
而对于记录4 , ShareCount
为2
我试过这个
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.