如何在含重复用户的SQL表Table_2中填充user_id列?
问题描述
现有两张SQL表,结构及数据如下:
Table_1
| full_name | user_id | random_column_1 |
|---|---|---|
| John Smith | 1234 | blah |
| Joe Smith | 5678 | blah |
| Jane Doe | 5978 | blah |
| Mark Long | 5971 | blah |
Table_2
| user | user_id | random_column_2 |
|---|---|---|
| Jane Doe | blah | |
| Jane Doe | blah | |
| Mark Long | blah | |
| Mark long | blah |
需求:用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存在重复用户条目且无法去重,需解决该问题。
问题分析
- 关联条件逻辑错误:原SQL中
WHERE Table_2.user = Table_1.user_id是错误匹配,应该用Table_2.user对应Table_1的full_name字段,而非user_id。 - 子查询返回多行:即使关联条件修正,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
相关产品推荐
相关产品推荐

