sql - 根据 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
解决方案
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
推荐阅读
- elasticsearch - 带有规范化器的 ElasticSearch 关键字文件不适用于通配符查询
- python-3.x - 我应该如何在 Python 中使用 id() 函数?
- python-3.x - 使用 boto3 在 dynamodb 中返回所有具有最大排序键的哈希键项
- r - 我想在 for 循环中的 ggplot2 中绘制多个 geom_line,所以我能够绘制线条但面临着色问题。任何人都可以建议如何做
- git - 如何找出一个合并提交中包含哪些提交?
- java - 如何通过 Eclipse 将自动化测试用例关联到 Azure
- mysql - 如何使用 node.js 将 excel 文件导入 MySQL?
- ruby-on-rails - 按轨道 4 上的条件排序
- node.js - 如何在 MongoDB 上高效查询复杂的层次结构
- php - php imagemagick 或任何其他方式来查找拼图的 xy 坐标