Sql 为什么不是';我的左手不工作吗?
如果一个人在PlayerToWar表中没有同时包含@WarID和PlayerID的行,那么目标是将不活动int加上50 这是我目前拥有的脚本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
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
将始终不返回任何结果。