SQL报错:子查询未用EXISTS仅能指定一个表达式的解决
SQL更新报错解决方案:Only one expression can be specified in the select list
错误原因分析
你写的赋值语句里,子查询返回了DeviceName和SUBSTRING处理结果两个字段,但SET RoomName只能接收单个表达式的结果,这直接触发了报错。另外,即使去掉多余的DeviceName,如果子查询没有和要更新的表做关联,会返回多行数据,同样会报错。
正确的更新语句
场景1:跨表更新目标表的RoomName字段
假设你要更新的目标表为TargetTable,且该表和Location.Device通过某个关联字段(比如DeviceID)匹配,语句如下:
UPDATE t SET t.RoomName = SUBSTRING(d.DeviceName, 5, LEN(d.DeviceName) - 5) FROM TargetTable t INNER JOIN Location.Device d ON t.DeviceID = d.DeviceID -- 替换为实际的关联字段
场景2:直接修改Location.Device的DeviceName字段(匹配你的期望结果)
如果你的需求是把DeviceName替换为截取后的值,语句更简洁:
UPDATE Location.Device SET DeviceName = SUBSTRING(DeviceName, 5, LEN(DeviceName) - 5)
执行结果验证
- 场景1执行后,目标表的
RoomName会被替换为截取后的设备名称:
| 房间名称 | 设备名称 |
|---|---|
| Room1-A | Bldg-Room1-AA |
| Room2-B | Bldg-Room2-BA |
| Room3-B | Bldg-Room3-BA |
| Room4-A | Bldg-Room4-AA |
- 场景2执行后,数据完全符合你给出的期望结果:
| 房间名称 | 设备名称 |
|---|---|
| A | Room1-A |
| B | Room2-B |
| B | Room3-B |
| A | Room4-A |
内容的提问来源于stack exchange,提问作者Jawane
相关产品推荐
相关产品推荐

