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