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