41

私は以下のようなことをしたい:

DELETE UserPredictions
  GROUP BY UserId
  HAVING COUNT(*) < 500

しかし、構文エラーが発生します。SQL Server で HAVING 句を使用して削除を実行することは可能ですか? または、カウントを CTE にロールアップして、結合で削除を実行する必要がありますか?

4

5 に答える 5

54

あまり。having 句は集計を意味します。つまり、元の行はもうありません。

私はあなたが次のことを望んでいると思います:

DELETE from UserPredictions
where UserId in (select UserId from UserPredictions group by UserId having count(*) < 500)
于 2012-07-29T01:52:29.273 に答える
27

DELETEステートメント内で結合された副選択を使用できます。

DELETE a
FROM   UserPredictions a
JOIN
(
    SELECT   UserId
    FROM     UserPredictions
    GROUP BY UserId
    HAVING   COUNT(1) < 500
) b ON a.UserId = b.UserId

SQLFiddle デモ

于 2012-07-29T02:57:33.247 に答える
11

次のネストされたクエリを試してください。

DELETE FROM UserPredictions  
WHERE UserId IN (SELECT UserId
                 FROM UserPredictions 
                 GROUP BY UserId
                 HAVING COUNT(*) < 500)
于 2012-07-29T01:53:16.660 に答える
0

私はそれが可能だとは思わないが、あなたはこれを試すことができる

更新:使用することIninner joinできます

Declare @Sample table 
(
UserID int,
col2 int
)
INSERT INTO @Sample
SELECT 1,50 UNION ALL
SELECT 1,100 UNION ALL
SELECT 2,150 UNION ALL
SELECT 2,200 union all
Select 4,500

DeLETE FROM @Sample  
WHERE UserID IN (SELECT UserID
             FROM @Sample 
             GROUP BY UserID
             HAVING COUNT(*) > 1)


 Delete O
 FROM @Sample O
 INNER JOIN 
 (
  SELECT UserID 
  FROM @Sample  
  GROUP BY UserID
 HAVING COUNT(*) >1
 ) X
ON O.UserID = X.UserID

私が最初に投稿した答え:

Delete O
FROM UserPredictions O
INNER JOIN 
(
 SELECT UserID 
 FROM UserPredictions  
 GROUP BY UserID
 HAVING COUNT(*) <500
 ) X
ON O.UserID = X.UserID
于 2012-07-29T01:55:04.140 に答える