用相关列更新表的最佳方法是什么?

时间:2018-07-06 11:02:26

标签: sql sql-server tsql

我不知道如何解决我的问题,所以希望您能帮助我。因此,我有一个表,例如TableA:

Id  Code    ProductId  RelatedId
1   APlus   100        NULL
2   AMinus  100        NULL
3   BPlus   200        NULL
4   BMinus  200        NULL

现在,我的RelatedId = NULL,我想得出以下结果:

Id  Code    ProductId  RelatedId
1   APlus   100        2
2   AMinus  100        1
3   BPlus   200        4
4   BMinus  200        3

对于每个ProductId,代码都严格相互连接(与相同的Code Plus-减号相反)。

我应该创建一些游标吗?但是我该怎么办? ID?

3 个答案:

答案 0 :(得分:2)

您可以使用outer apply。这是一种方法:

select t.*, t2.id
from t outer apply
     (select top 1 t2.*
      from t
      where t2.productid = t.productid and
            t2.code <> t.code
     ) t2;

这假设有两行,一减一加。您可以更明确:

select t.*, t2.id
from t outer apply
     (select top 1 t2.*
      from t
      where t2.productid = t.productid and
            (t2.code like '%Plus' and t.code like '%Minus') or
             t2.code like '%Minus' and t.code like '%Plus'
            )
     ) t2;

我应该注意,这很容易适应update

update t
    set relatedid = t2.id
from t outer apply
     (select top 1 t2.*
      from t
      where t2.productid = t.productid and
            t2.code <> t.code
     ) t2;

答案 1 :(得分:0)

您可以使用subquery

select t.*, t2.id as RelatedId
from table t outer apply 
     ( select top 1 t1.id
       from table t1
       where t1.productid = t.productid and
             t1.code <> t.code
     ) t2;

答案 2 :(得分:0)

尝试这个

update cte set cte.RelatedId  = cte1.Id from CTE 
inner join CTE cte1 on CTE.ProdecTid = cte1.ProdecTid and CTE.Id != cte1.Id

此处CTE是您的表格名称