[英]To update specific column values based on other columns in mssql
我有一個巨大的表,需要根據其他兩列中的值來更新一列中的值,然后提取數據並將其放在其他新的#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
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
您可以使用窗口功能和可更新的CTE進行此操作:
with toupdate as (
select t.*,
max(case when seqnum = 1 then value end) over (partition by doc_guid) as use_value
from (select t.*,
row_number() over (partition by doc_guid order by priority) as seqnum
from t left join
(values ('AC', 1),
('AB', 2),
('N', 3)
) v(value, priority)
on v.value = t.value
) t
)
update toupdate
set value = use_value
where use_value <> value;
這種方法有兩個主要優點。
首先,更改優先級非常簡單,因為這些優先級嵌入在VALUES()
子句中。
其次,外部where
子句僅更新需要更新的行。
這也應該具有良好的性能特征。
我們可以嘗試將CASE
與EXISTS
子句一起使用:
UPDATE t1
SET Value = CASE WHEN EXISTS (SELECT 1 FROM #temp t2
WHERE t1.DOC_GUID = t2.DOC_GUID AND
t2.Value = 'AC')
THEN 'AC'
WHEN EXISTS (SELECT 1 FROM #temp t2
WHERE t1.DOC_GUID = t2.DOC_GUID AND
t2.Value = 'AB')
THEN 'AB'
ELSE 'N' END
FROM #temp t1;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.