2017-12-24 3 views
4

私は2人のユーザー、1つはadminと呼ばれ、もう1つはadmin2と呼ばれます。SQLの特定のユーザーのステートメント

私は特定のアカウントの達成度を向上させたいと思っていますが、私のケースではadminの場合にのみSQLクエリを書いていますが、それにもかかわらず、ユーザーadmin2の同じ達成にも影響します。私は間違って何をしていますか?

DECLARE @Achievement1 INT 

SELECT @Achievement1 = Achievement1 
FROM [dbo].[Achievement] 
WHERE [dbo].[Achievement].UserID = (SELECT [AccountID] 
            FROM [dbo].[Account] 
            WHERE [Username] = 'Admin') 

IF (@Achievement1 < 100) 
    UPDATE [dbo].[Achievement] 
    SET [Achievement1] += 2 
ELSE 
    UPDATE [dbo].[Achievement] 
    SET [Achievement1] += 0 
+0

コードは、ユーザーADMIN2 "に影響を持っています。 「admin2」を含むその他のコードはありますか?私の推測では、[admin2]は[dbo]の値を参照しています。[Achievement] .Achievement1 – Brien

答えて

6

条件が満たされたときにあなたのコードはすべての行Achievementを更新しています。一致する行を更新するだけではありません。

あなたのロジックはむしろ複雑です。私はあなただけでこれを行うことができると思います。

UPDATE a 
    SET Achievement1 += 2 
    FROM dbo.Achievement a 
    WHERE a.Achievement1 < 100 AND 
      a.UserId = (SELECT ac.AccountId 
         FROM dbo.Account ac 
         WHERE ac.UserName = 'admin' 
        ); 

注:持つ別で1つのテーブルが一致AccountIdUserIdはかなり混乱しています。比較がユーザーIDとアカウントIDのどちらにもなりませんか?

+0

ありがとう、これは最も簡単な解決策でした。 –

+0

注記では、私はその問題を解決するのに少し怠惰でしたが、私もそれを解決するでしょう、その問題は世界から外れるでしょう。 –

2

このすべては必要ない、あなただけのように参加して更新することができます。あなたが表示されない投稿

UPDATE a1 
SET a1.[Achievement1] = CASE WHEN a1.Achievement1 < 100 THEN a1.[Achievement1] + 2 
          ELSE a1.[Achievement1] END 
FROM [dbo].[Achievement] AS a1 
INNER JOIN [dbo].[Account] AS a2 ON a1.UserID = a2.[AccountID] 
WHERE a2.UserName = 'admin'; 
関連する問題