SQL server加入问题

SQL server加入问题,sql,sql-server,join,inner-join,Sql,Sql Server,Join,Inner Join,我在一个返回奇怪结果的存储过程中有以下语句。给定两列,其中一个RL小于0,例如-2,则应将2添加到另一列HD。如果负值为-8,则应在HD列中添加8 在我刚刚做的一个测试中,RL列为0,HD为2。我将RL改为-2并运行代码。我期望:RL=0,HD=4。结果是RL=0,HD=5 我认为问题是由于加入的存在。我该如何写这个来用WHERE子句替换join呢 UPDATE P SET P.HD = P.HD + P.RL ,P.RL = 0 FROM Products P INNER JOIN (

我在一个返回奇怪结果的存储过程中有以下语句。给定两列,其中一个RL小于0,例如-2,则应将2添加到另一列HD。如果负值为-8,则应在HD列中添加8

在我刚刚做的一个测试中,RL列为0,HD为2。我将RL改为-2并运行代码。我期望:RL=0,HD=4。结果是RL=0,HD=5

我认为问题是由于加入的存在。我该如何写这个来用WHERE子句替换join呢

UPDATE P
SET P.HD = P.HD + P.RL
    ,P.RL = 0
FROM Products P
INNER JOIN (
    SELECT id
        ,RL
    FROM Products
    WHERE id IN (
            SELECT ProductID
            FROM OrderDetails
            WHERE OrderID = @OrderId
            )
        AND RL < 0
    ) Q ON P.ID = Q.id
干杯,试试这个-

UPDATE Products
SET HD = HD + RL,
    RL = 0
FROM P
WHERE RL < 0
    AND ID IN (
            SELECT ProductID
            FROM dbo.OrderDetails
            WHERE OrderID = @OrderId
        )

天才谢谢你,德瓦特。成功了。那么,为什么使用联接会使它看起来像是多次运行计算呢?我是新手,仍在学习SQLI将是诚实的。。。不知道;您没有提供任何DDL和数据示例,因此我只提供语法正确的答案,无需重新阅读…出于学习目的,请查看本书:感谢链接。当我在那里的时候,我也会发现DDL是什么不要在问题标题中添加已解决的问题。StackOverflow已经知道如果您接受答案,问题是否已解决。您好,抱歉,我不知道。我在想,我不想浪费其他用户的时间看一个已经回答过的问题。所以,一旦答案被接受,我猜问题就会消失?这取决于你的搜索方式,例如,它不会出现在“未被认可的问题”选项卡中。
DECLARE @t TABLE (a INT, b INT)

INSERT INTO @t (a, b)
VALUES (1, 2)

UPDATE @t
SET a = b, b = 0

SELECT * FROM @t