SQL Server使用SELECT语句更新列报错:子查询返回多表达式问题
解决UPDATE子查询报错:Only one expression can be specified...
嘿,这个错误我太熟啦!咱们来一步步拆解并解决它~
错误原因分析
你写的UPDATE语句里,子查询返回了两列:[User Organization]和计算后的Better_test。但数据库在执行SET Better_test = (子查询)时,要求子查询只能返回单个列/单个值——它不知道该拿哪一列去赋值给目标字段,所以就抛出了这个报错。
最优解决方案(最简单直接)
其实完全不需要用子查询,直接把计算逻辑写到SET子句里就行,因为你要计算的值就是基于当前行的[User Organization]字段:
UPDATE Logins SET Better_test = RIGHT([User Organization], LEN([User Organization]) - CHARINDEX(',', [USER ORGANIZATION]))
其他可选方案(如果需要用子查询场景)
如果你因为某些原因必须用子查询,要确保子查询只返回计算后的目标列,并且关联到当前行(避免所有行被更新成同一个值):
方案1:JOIN子查询更新
UPDATE l SET Better_test = subquery.Better_test FROM Logins l JOIN ( SELECT [User Organization], RIGHT([User Organization], LEN([User Organization]) - CHARINDEX(',', [USER ORGANIZATION])) AS Better_test FROM Logins ) subquery ON l.[User Organization] = subquery.[User Organization]
方案2:带关联的单行子查询
UPDATE Logins SET Better_test = ( SELECT RIGHT([User Organization], LEN([User Organization]) - CHARINDEX(',', [USER ORGANIZATION])) FROM Logins sub WHERE sub.[User Organization] = Logins.[User Organization] )
⚠️ 注意:如果[User Organization]存在重复值,要确保子查询只会返回一行结果,否则会触发“子查询返回多个值”的新报错。
方案3:用CTE(公用表表达式)更新(可读性更强)
WITH UpdatedLogins AS ( SELECT Better_test, RIGHT([User Organization], LEN([User Organization]) - CHARINDEX(',', [USER ORGANIZATION])) AS New_Better_test FROM Logins ) UPDATE UpdatedLogins SET Better_test = New_Better_test
额外小提醒
如果[User Organization]字段中没有逗号,CHARINDEX(',', ...)会返回0,此时LEN(...) - 0等于字段长度,RIGHT(字段, 长度)会返回整个字段。如果这不是你想要的结果,可以加个条件判断处理这种情况:
UPDATE Logins SET Better_test = CASE WHEN CHARINDEX(',', [USER ORGANIZATION]) > 0 THEN RIGHT([User Organization], LEN([User Organization]) - CHARINDEX(',', [USER ORGANIZATION])) ELSE [User Organization] -- 或者换成你需要的默认值,比如NULL END
内容的提问来源于stack exchange,提问作者AISG
相关产品推荐
相关产品推荐

