Sql 为什么不是';我的左手不工作吗?

Sql 为什么不是';我的左手不工作吗?,sql,sql-server,left-join,ssms,Sql,Sql Server,Left Join,Ssms,如果一个人在PlayerToWar表中没有同时包含@WarID和PlayerID的行,那么目标是将不活动int加上50 这是我目前拥有的脚本 UPDATE P SET P.Inactivity = P.Inactivity + 50, P.Processed = 1 FROM dbo.Players as P LEFT JOIN ( SELECT PlayerID FROM dbo.PlayerToWar

如果一个人在PlayerToWar表中没有同时包含@WarID和PlayerID的行,那么目标是将不活动int加上50

这是我目前拥有的脚本

UPDATE P
    SET P.Inactivity = P.Inactivity + 50,
        P.Processed = 1
    FROM dbo.Players as P
    LEFT JOIN ( SELECT PlayerID
                FROM dbo.PlayerToWar
                WHERE WarID = @WarID
                ) X
    ON P.PlayerID = X.PlayerID
    WHERE P.PlayerID = NULL and P.Processed = 0
我认为它将在dbo.Players中存在但SELECT语句中不存在的所有人的非活动列中添加50,然后将其状态设置为已处理,以便脚本的其余部分不会影响他们


这是我找到的唯一方法。

您必须使用is NULL而不是=NULL,并且我认为检查应该在X.PlayerId而不是p.PlayerId上

UPDATE P
SET P.Inactivity = P.Inactivity + 50,
    P.Processed = 1
FROM dbo.Players as P
LEFT JOIN ( SELECT PlayerID
            FROM dbo.PlayerToWar
            WHERE WarID = @WarID
            ) X
ON P.PlayerID = X.PlayerID
WHERE X.PlayerID IS NULL and P.Processed = 0

您必须使用IS NULL而不是=NULL,并且我认为应该在X.PlayerId而不是p.PlayerId上进行检查

UPDATE P
SET P.Inactivity = P.Inactivity + 50,
    P.Processed = 1
FROM dbo.Players as P
LEFT JOIN ( SELECT PlayerID
            FROM dbo.PlayerToWar
            WHERE WarID = @WarID
            ) X
ON P.PlayerID = X.PlayerID
WHERE X.PlayerID IS NULL and P.Processed = 0
个人偏好,但在我看来,不把子查询放在括号内更干净。原始查询永远不会命中任何结果,因为(大概)players表中的数据不允许空PlayerID


个人偏好,但在我看来,不把子查询放在括号内更干净。原始查询永远不会命中任何结果,因为(大概)players表中的数据不允许空PlayerID。

where子句应该有x.PlayerID为空。另外,P.Processed=1应该在join语句中

UPDATE P
SET P.Inactivity = P.Inactivity + 50,
    P.Processed = 1
FROM dbo.Players as P
LEFT JOIN ( SELECT PlayerID
            FROM dbo.PlayerToWar
            WHERE WarID = @WarID
            ) X
ON P.PlayerID = X.PlayerID
and P.Processed = 0
WHERE X.PlayerID is NULL

where子句应该有x.playerID为null。另外,P.Processed=1应该在join语句中

UPDATE P
SET P.Inactivity = P.Inactivity + 50,
    P.Processed = 1
FROM dbo.Players as P
LEFT JOIN ( SELECT PlayerID
            FROM dbo.PlayerToWar
            WHERE WarID = @WarID
            ) X
ON P.PlayerID = X.PlayerID
and P.Processed = 0
WHERE X.PlayerID is NULL

尽管您可以使用
左连接
不存在
似乎是您逻辑的更清晰实现:

update P
    set Inactivity = p.Inactivity + 50,
        Processed = 1
    from dbo.Players  P
    where not exists (select
                      from dbo.PlayerToWar ptw
                      where ptw.PlayerID = p.PlayerId and ptw.WarID = @WarID
                     ) and
          p.Processed = 0;

这也解决了查询中的
=NULL
问题。

尽管您可以使用
左连接
不存在
似乎是您逻辑的更清晰的实现:

update P
    set Inactivity = p.Inactivity + 50,
        Processed = 1
    from dbo.Players  P
    where not exists (select
                      from dbo.PlayerToWar ptw
                      where ptw.PlayerID = p.PlayerId and ptw.WarID = @WarID
                     ) and
          p.Processed = 0;


这也解决了查询中的
=NULL
问题。

X.playerId=NULL不起作用,因为您无法将值与NULL进行比较。好的调用,我在方向盘上睡着了。另外,warid上的where on应该在X上。WarID=@WarID和P.PlayerID=X.PlayerID我猜这就是我在几乎没有睡眠的情况下写出答案的原因。X.PlayerID=null不起作用,因为你无法将值与null进行比较。好的,我在方向盘上睡着了。另外,WarID上的where应该在X上。WarID=@WarID和P.PlayerID=X.PlayerID我猜这就是我在几乎没有睡眠的情况下写出答案的原因。你是有错误还是有一些样本数据?你真的希望在
PlayerID
中有一行
PlayerID
为空吗?你是基于可空列加入表吗?你是有错误还是有错误一些示例数据?您真的希望在
PlayerID
为NULL的
PlayerID
中有一行吗?您是否基于可为NULL的列加入表?X.PlayerID=NULL不起作用,因为您无法将值与NULL进行比较
X.PlayerID为NULL
是进行比较的正确方法
X.PlayerID=NULL
将始终不返回任何结果。X.PlayerID=NULL不起作用,因为无法将值与NULL进行比较,其中
X.PlayerID为NULL
是进行比较的正确方法
X.PlayerID=NULL
将始终不返回任何结果。