簡體   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