SQL使用另一行中的值更新行中的值

SQL使用另一行中的值更新行中的值,sql,sql-server,Sql,Sql Server,我需要遍历一个大数据集,并将产品ID填充到该GUID中包含的所有产品的负BaseCurrencyValue的特殊ID字段中 因此,在下面的示例中,所有行的特殊ID都应该是1328 我知道如何像这样直接更新 update mytable set SpecialID = productID where SpecialID is null 但我不知道如何更新其他非负价格 saleitemid productid quantity BaseCurrencyPrice saleguid

我需要遍历一个大数据集,并将产品ID填充到该GUID中包含的所有产品的负BaseCurrencyValue的特殊ID字段中

因此,在下面的示例中,所有行的特殊ID都应该是1328

我知道如何像这样直接更新

update mytable
set SpecialID = productID
where SpecialID is null 
但我不知道如何更新其他非负价格

saleitemid productid    quantity    BaseCurrencyPrice   saleguid    specialsetinstanceid specialid
393191236  34           2           10                  48EC5DF9    1                    NULL
393191235  88           2           10                  48EC5DF9    1                    NULL
393191237  1328         1           -5                  48EC5DF9    1                    NULL

您可以使用窗口功能:

with toupdate as (
      select t.*,
             max(case when BaseCurrencyPrice < 0 then productid end) as new_specialID
      from t
     )
update toupdate
     set specialid = new_specialid
     where new_specialid is not null;
使用自联接:

update m1
set m1.SpecialID = m2.productID
from mytable m1 inner join mytable m2
on m2.saleguid = m1.saleguid and m2.basecurrencyprice < 0
where m1.SpecialID is null 
> saleitemid | productid | quantity | BaseCurrencyPrice | saleguid | specialsetinstanceid | specialid
> ---------: | --------: | -------: | ----------------: | :------- | -------------------: | :--------
>  393191236 |        34 |        2 |                10 | 48EC5DF9 |                    1 | 1328     
>  393191235 |        88 |        2 |                10 | 48EC5DF9 |                    1 | 1328     
>  393191237 |      1328 |        1 |                -5 | 48EC5DF9 |                    1 | 1328