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

如何在含重复用户的SQL表Table_2中填充user_id列?

问题描述

现有两张SQL表,结构及数据如下:

Table_1

full_nameuser_idrandom_column_1
John Smith1234blah
Joe Smith5678blah
Jane Doe5978blah
Mark Long5971blah

Table_2

useruser_idrandom_column_2
Jane Doeblah
Jane Doeblah
Mark Longblah
Mark longblah

需求:用Table_1中的user_id填充Table_2的user_id列,且不修改两张表的其他列。

当前执行的SQL语句:

UPDATE Table_2
SET user_id = (SELECT user_id 
               FROM Table_1 
               WHERE Table_2.user = Table_1.user_id;

返回错误:

Single-row subquery returns more than one row

已知Table_2存在重复用户条目且无法去重,需解决该问题。

问题分析
  1. 关联条件逻辑错误:原SQL中WHERE Table_2.user = Table_1.user_id是错误匹配,应该用Table_2.user对应Table_1的full_name字段,而非user_id。
  2. 子查询返回多行:即使关联条件修正,Table_2的重复条目会导致子查询触发返回多行的错误;此外Table_2存在大小写不一致的用户名(如Mark Long和Mark long),需处理匹配问题。
解决方案

方案1:用聚合函数确保子查询返回单行

通过MAX()或MIN()聚合函数强制子查询返回单个user_id(Table_1中每个用户名对应的user_id唯一,聚合不改变结果),同时修正关联条件并处理大小写匹配:

UPDATE Table_2
SET user_id = (
    SELECT MAX(user_id)
    FROM Table_1
    WHERE LOWER(Table_1.full_name) = LOWER(Table_2.user)
);

方案2:使用JOIN方式更新(更高效)

用JOIN替代子查询,规避单行子查询的限制,同时处理大小写匹配:

UPDATE Table_2 t2
JOIN Table_1 t1 ON LOWER(t1.full_name) = LOWER(t2.user)
SET t2.user_id = t1.user_id;

说明

  • 两种方案均保留Table_2的重复条目,仅填充对应user_id,不修改其他列。
  • LOWER()函数用于统一大小写,确保Mark Long和Mark long都能匹配到正确的user_id;若你的数据库默认大小写不敏感,可省略该函数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 10:43:28