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:
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.
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
)
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