You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写SQL UPDATE语句实现两表行一对一关联赋值更新

一对一关联更新两表字段的解决方案

核心思路是通过窗口函数为两张表分别生成连续行号,基于行号做等值关联实现一一匹配,就能避免你之前遇到的更新问题。

适用PostgreSQL的写法

WITH numbered_normal AS (
    -- 为normal表按id升序生成行号,可自定义排序规则
    SELECT id, ROW_NUMBER() OVER (ORDER BY id) AS row_num
    FROM normal
),
numbered_starts AS (
    -- 为starts_after表按id升序生成行号,可自定义排序规则
    SELECT id AS sa_id, ROW_NUMBER() OVER (ORDER BY id) AS row_num
    FROM starts_after
)
UPDATE normal n
SET fk_test_id = ns.sa_id
FROM numbered_normal nn
INNER JOIN numbered_starts ns ON nn.row_num = ns.row_num
WHERE n.id = nn.id;

适用MySQL 8.0+的写法

UPDATE normal n
INNER JOIN (
    SELECT id, ROW_NUMBER() OVER (ORDER BY id) AS row_num FROM normal
) nn ON n.id = nn.id
INNER JOIN (
    SELECT id AS sa_id, ROW_NUMBER() OVER (ORDER BY id) AS row_num FROM starts_after
) ns ON nn.row_num = ns.row_num
SET n.fk_test_id = ns.sa_id;

注意事项

  • 如果你需要调整匹配顺序,只需要修改OVER(ORDER BY 字段名)里的排序字段即可,不需要改动其他逻辑
  • 仅两个表行号匹配的记录会被更新,若两表行数不一致,行号超出小表行数的记录不会被赋值

内容的提问来源于stack exchange,提问作者Ben

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 11:57:03