繁体   English   中英

为什么我的LEFT JOIN不起作用?

[英]Why isn't my LEFT JOIN working?

目标是如果某人在表PlayerToWar中没有包含@WarID和其PlayerID的行,则将Inactivity 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,然后将其状态设置为“已处理”,以便其余脚本不会影响他们。

这是我发现解决该问题的唯一方法。

尽管您可以使用left join ,但not exists似乎是您的逻辑更清晰的实现:

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问题。

您必须使用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
UPDATE P
SET P.Inactivity = P.Inactivity + 50,
    P.Processed = 1
FROM dbo.Players as P
LEFT JOIN 
  dbo.PlayerToWar x      
ON P.PlayerID = x.PlayerID and x. WarID = @WarID   
WHERE x.PlayerID IS NULL and P.Processed = 0

出于个人喜好,但IMO最好不要将子查询放在括号内。 原始查询永远不会产生任何结果,因为(大概)玩家表中的数据不允许使用null的PlayerID。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM