代码之家  ›  专栏  ›  技术社区  ›  notjoshno Deathsidious

为什么我的左加入不起作用?

  •  1
  • notjoshno Deathsidious  · 技术社区  · 7 年前

    如果一个人的表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,然后将他们的状态设置为“已处理”,以便脚本的其余部分不会影响他们。

    这是我找到的唯一解决办法。

    4 回复  |  直到 7 年前
        1
  •  4
  •   Gordon Linoff    7 年前

    尽管你可以使用 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 在您的查询中出现问题。

        2
  •  1
  •   SQLApostle    7 年前

    您必须使用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
    
        3
  •  1
  •   user2366842    7 年前
    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
    

    个人偏好,但在我看来,最好不要将子查询放在括号内。原始查询永远不会命中任何结果,因为(可能)players表中的数据不允许空playerid。

        4
  •  1
  •   Ramaranjan Ruj    7 年前

    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