I am trying to update some fields based on their occurence. If they only occur one time, I am updating some status field.
My current code is as follows:
UPDATE table1
SET statusField = 1
WHERE someID = (
SELECT someID
FROM table1
GROUP BY someID HAVING COUNT(*) = 1
)
This returns an error like the one in the title: Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.
Is there any other, as easily readable/simple, solution to this?
Use IN
keyword instead of equals operator like so:
UPDATE table1
SET statusField = 1
WHERE someID IN (
SELECT someID
FROM table1
GROUP BY someID HAVING COUNT(*) = 1
)
Using =
requires that exactly 1 result is returned by the subquery. IN
keyword works on a list.
You should join your tables in the subselect. It is possible to use 'in', but in your case I would use exists:
UPDATE table1 x
SET statusField = 1
WHERE exists (
SELECT null
FROM table1
WHERE x.someID = someID
GROUP BY someID
HAVING COUNT(*) = 1
)
For better performance I would use this script instead (sqlserver-2008+):
;WITH x as
(
SELECT rc = count() over (partition by someID), statusField
FROM table1
)
UPDATE x
SET statusField = 1
WHERE rc = 1
Try this
Use Top
UPDATE table1
SET statusField = 1
WHERE someID = (
SELECT TOP 1 someID
FROM table1
GROUP BY someID HAVING COUNT(*) = 1
)
Or you can use IN clause
UPDATE table1
SET statusField = 1
WHERE someID IN (
SELECT someID
FROM table1
GROUP BY someID HAVING COUNT(*) = 1
)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With