2014-04-07 37 views
9

我試圖根據它們的出現更新一些字段。如果他們只發生一次,我正在更新一些狀態字段。SQL Server子查詢返回多個值。當子查詢跟隨(字符)或子查詢用作表達式時,這是不允許的

我當前的代碼如下:

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

這將返回一個錯誤,如一個在標題:Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.

是否有任何其他,如容易閱讀/簡單,解決這個?

回答

17

使用IN關鍵字,而不是等於運營商,像這樣:

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

使用=要求恰好1結果子查詢返回。 IN關鍵字在列表中工作。

+1

謝謝你很多指出了!這次完美無瑕。 – NicT

+0

此處不需要'GROUP BY具有COUNT(*)= 1'的GROUP BY。 –

+0

太棒了。謝謝! – Rob

1

試試這個

使用

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

或者你可以使用IN條款

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

你的第一個建議不會返回有用的答案 –

3

你應該加入你的表中的子查詢中。這是可能的「中」使用,但在你的情況我會用存在:

UPDATE table1 x 
SET statusField = 1 
WHERE exists (
       SELECT null 
       FROM table1 
       WHERE x.someID = someID 
       GROUP BY someID 
       HAVING COUNT(*) = 1 
       ) 

爲了更好的表現,我會用這個腳本,而不是(SQLSERVER-2008 +):

;WITH x as 
(
SELECT rc = count() over (partition by someID), statusField 
FROM table1 
) 
UPDATE x 
SET statusField = 1 
WHERE rc = 1 
+1

謝謝!我結束了使用IN運算符,因爲查詢只需要運行50行以下,所以不要太大的查詢。 但是,我會將此添加到我的reportoire!再次感謝你! :) – NicT

相關問題