SQL Server子查询返回了多个值。当子查询后跟(chars)或子查询用作表达式时,不允许这样做

SQL Server子查询返回了多个值。当子查询后跟(chars)或子查询用作表达式时,不允许这样做,sql,sql-server,tsql,Sql,Sql Server,Tsql,我正在尝试根据出现的字段更新某些字段。如果它们只出现一次,我将更新一些状态字段 我目前的代码如下: UPDATE table1 SET statusField = 1 WHERE someID = ( SELECT someID FROM table1 GROUP BY someID HAVING COUNT(*) = 1 ) 这将返回一个类似于标题中的错误:子查询返回了多个

我正在尝试根据出现的字段更新某些字段。如果它们只出现一次,我将更新一些状态字段

我目前的代码如下:

UPDATE table1
SET statusField = 1
WHERE someID = (
               SELECT someID
               FROM table1
               GROUP BY someID HAVING COUNT(*) = 1
               )
这将返回一个类似于标题中的错误:
子查询返回了多个值。当子查询在=、!=、=或者当子查询用作表达式时。


有没有其他易读/简单的解决方案?

在关键字中使用
,而不是像这样使用equals运算符:

UPDATE table1
SET statusField = 1
WHERE someID IN (
           SELECT someID
           FROM table1
           GROUP BY someID HAVING COUNT(*) = 1
           )
使用
=
要求子查询只返回1个结果<关键字在列表中起作用。

试试这个

使用Top

UPDATE table1
SET statusField = 1
WHERE someID = (
               SELECT TOP 1 someID
               FROM table1
               GROUP BY someID HAVING COUNT(*) = 1
               )
也可以在子句中使用

UPDATE table1
SET statusField = 1
WHERE someID IN (
               SELECT someID
               FROM table1
               GROUP BY someID HAVING COUNT(*) = 1
               )

您应该在子选择中加入表。可以使用“in”,但在您的情况下,我将使用exists:

UPDATE table1 x
SET statusField = 1
WHERE exists (
               SELECT null
               FROM table1
               WHERE x.someID = someID
               GROUP BY someID 
               HAVING COUNT(*) = 1
               )
为了获得更好的性能,我将使用此脚本(sqlserver-2008+):


非常感谢你指出这一点!这次运行得很好。
这里不需要COUNT(*)=1的someID分组。太棒了。非常感谢。你的第一个建议不会得到有用的回答谢谢!我最终使用了IN操作符,因为查询只需运行不到50行,所以查询不会太大。不过,我会把这个添加到我的报告中!再次感谢你!:)
;WITH x as
(
SELECT rc = count() over (partition by someID), statusField
FROM table1
)
UPDATE x
SET statusField = 1
WHERE rc = 1