需求:表 Test 中,將 Num 列更新為同組 Col_A 值出現的次數。例如 Col_A=123 出現 2 次,則該組兩行 Num 均更新為 2。本文提供 MySQL 8.0+ 窗口函數方案與通用連接更新方案。
CREATE TABLE Test (Col_A INT, Num INT);
INSERT INTO Test VALUES (123,0), (123,0), (124,0), (125,0);
-- 期望:123→2, 124→1, 125→1
WITH Counts AS (
SELECT Col_A, COUNT(*) AS cnt
FROM Test
GROUP BY Col_A
)
UPDATE Test t
JOIN Counts c ON t.Col_A = c.Col_A
SET t.Num = c.cnt;
或使用窗口函數直接更新(部分數據庫支持):
UPDATE Test
SET Num = cnt
FROM (
SELECT Col_A, COUNT(*) OVER (PARTITION BY Col_A) AS cnt
FROM Test
) AS sub
WHERE Test.Col_A = sub.Col_A;
UPDATE Test t
INNER JOIN (
SELECT Col_A, COUNT(*) AS cnt
FROM Test
GROUP BY Col_A
) AS agg ON t.Col_A = agg.Col_A
SET t.Num = agg.cnt;
這是最佳回答採用的方案,兼容性最好。
UPDATE Test t
SET Num = (SELECT COUNT(*) FROM Test WHERE Col_A = t.Col_A);
每行執行一次子查詢,大表性能差,但語法最直觀。
SELECT * FROM Test ORDER BY Col_A;
-- Col_A | Num
-- 123 | 2
-- 123 | 2
-- 124 | 1
-- 125 | 1
UPDATE Test t
INNER JOIN (
SELECT Col_A, Col_B, COUNT(*) AS cnt
FROM Test
GROUP BY Col_A, Col_B
) AS agg ON t.Col_A = agg.Col_A AND t.Col_B = agg.Col_B
SET t.Num = agg.cnt;
SELECT 驗證聚合結果