我遇到了这个错误:当子查询没有使用EXISTS引入时,只能在选择列表中指定一个表达式。

3
这是我的查询。我正在尝试更新表格中的新列:
update [dbo].[I_InstallBase_Updated_1]
set updated_padid = (SELECT 
                         CASE 
                            WHEN LEN(padid) - LEN(REPLACE(padid,'.','')) > 1
                               THEN  LEFT(padid,CHARINDEX('.',padid,CHARINDEX('.',padid,1)+1)-1) 
                            ELSE padid -- if there are 1 or 0 dots(.) then return the entire value
                         END as updated, *
                     FROM 
                         [I_InstallBase_Updated_1]
                     WHERE 
                         serial_number LIKE 'SKE%' 
                         AND PARENT_INSTANCE_END_DATE IS NULL
                         AND INSTANCE_USAGECODE = 'IN_RELATIONSHIP' 
                         AND instance_status != 'Expired'
                         AND installed_location_type = 'HZ_PARTY_SITES' 
                         AND padid != 'n/a'
                         AND padid LIKE ('%.%')
                    )

我遇到了这个错误:

当子查询没有引入 EXISTS 时,在选择列表中只能指定一个表达式。

我做错了什么?

快速修复:在 SELECT 中添加 TOP(1),更好的修复方法:更改逻辑,使子查询仅返回单个值以进行更新。 - Tim Biegeleisen
你的选择语句中有 ,*,导致返回多列。 - Jens
1个回答

5

您必须仅在子查询中返回一列,因此请删除查询的 ,* 部分。

子查询还必须始终仅返回一个行(值)以进行更新,因此您需要确保它具有适当的 where 子句来强制执行此操作,或者如 Tim 在上面的评论中提到的那样,如果不可能,请将子查询更改为 SELECT TOP(1)


1
你可能需要注意子查询也应该只返回一条记录。 - Tim Biegeleisen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接