[英]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.