SQL If特定用户的语句

问题描述 投票:4回答:2

所以我有2个用户,一个叫做admin,另一个叫admin2。

我写了一个SQL查询,其中我希望增加特定帐户的成就,在我的情况下仅针对admin,但尽管如此,用户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
sql sql-server
2个回答
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' 
                     );

注意:在一个表中将UserId与另一个表中的AccountId相匹配是非常令人困惑的。您确定比较不应该是用户ID还是帐户ID?


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';
© www.soinside.com 2019 - 2024. All rights reserved.