首页 > 解决方案 > 根据 mssql 中的其他列更新特定列的值

问题描述

我有一个巨大的表,我需要根据其他 2 列的值更新一列的值,我提取数据并将其放入其他新的 #temp 表中,其中代码段数据的格式如下

DOC_GUID     NAME   Value   Timestamp 
--------     ----   -----   ---------
1111         V1     AC      1134
1111         V2     AB      1134
1112         V1     N       1234
1112         V2     AB      1234
1113         V1     AC      1334
1113         V2     N       1334
1114         V1     N       1434
1114         V2     N       1434

我需要更新值变成这样

DOC_GUID     NAME   Value   Timestamp 
--------     ----   -----   ---------
1111         V1     AC      1134
1111         V2     AC      1134
1112         V1     AB      1234
1112         V2     AB      1234
1113         V1     AC      1334
1113         V2     AC      1334
1114         V1     N       1434
1114         V2     N       1434

我试图写出如下逻辑,但它根本无法执行

UPDATE #temp
SET Value = CASE WHEN (A.DOC_GUID = B.DOC_GUID
                      FROM #temp A inner join #temp B
                      ON A.Value= 'AC' OR 
                      B.Value = 'AC')
                 THEN 'AC'
                 WHEN (A.DOC_GUID = B.DOC_GUID
                      FROM #temp A inner join #temp B
                      ON A.Value= 'AB' OR 
                      B.Value = 'AB')
                 THEN 'AB' END

标签: sqlsql-server

解决方案


DDL:

declare @tbl table (DOC_GUID int, NAME varchar(3), Value varchar(3),  Timestamp int );
insert into @tbl values
(1111,'V1','AC',1134),
(1111,'V2','AB',1134),
(1112,'V1','AB',1234),
(1112,'V2','N',1234),
(1113,'V1','AC',1334),
(1113,'V2','N',1334),
(1114,'V1','N',1434),
(1114,'V2','N',1434);

更新查询:

update t1 set t1.Value = t2.Value
from @tbl t1 join (
    select *,
           -- here I use case statement to make AC come before AB
           row_number() over (partition by DOC_GUID order by case when [Value] = 'AC' then 'AA' else [Value] end) rn
    from @tbl
) t2 on t1.DOC_GUID = t2.DOC_GUID
where t2.rn = 1

推荐阅读