SQL Server 2016使用CASE仅修改重复Text列值的指定单行
解决方案
核心思路是利用SQL Server的窗口函数ROW_NUMBER()给结果集加行标识,结合行号和[Text]列的值做条件判断,即可精准只修改指定行的内容,不会影响另一条匹配记录。
1. 仅修改查询结果的显示值(不改动底层数据)
直接改造你现有的查询代码即可,示例如下:
WITH base_data AS ( SELECT DimCompany.SID as CompanyFK, DimBrand.SID as BrandFK, DimSalesman.SID as SalesmanFK, FLD01A as [Text], FLD024 as [Value], -- 此处ORDER BY后的内容请替换为能固定你数据集排序的字段,确保行号和你实际看到的顺序一致 ROW_NUMBER() OVER(ORDER BY (SELECT 0)) AS row_num FROM OPENQUERY(SYSTEM21,' select * from CWAUL.SA080VMF ') LEFT JOIN DimCompany ON DimCompany.CompanyCode = 'CW' LEFT JOIN DimBrand ON DimBrand.BrandName = 'Group' LEFT JOIN DimSalesman ON DimSalesman.SalesmanCode = 'R11' ) SELECT CompanyFK, BrandFK, SalesmanFK, CASE WHEN row_num = 2 AND [Text] = 'PERCENT ACHIEVED' THEN 'PERCENT ACHIEVED MONTH' ELSE [Text] END AS [Text], [Value] FROM base_data
注意:
ROW_NUMBER()的ORDER BY子句必须指定能确定行顺序的字段,如果你的数据集有默认排序依据(比如主键、创建时间字段),请替换掉ORDER BY (SELECT 0),避免多次查询行号不稳定。
2. 需要修改底层源表的记录
如果两条PERCENT ACHIEVED记录有唯一标识字段(比如主键ID),可以直接基于主键定位更新:
UPDATE CWAUL.SA080VMF SET FLD01A = 'PERCENT ACHIEVED MONTH' WHERE 主键字段 = '第二行对应的主键值'
如果没有唯一标识,也可以结合CTE加行号的方式更新:
WITH update_data AS ( SELECT FLD01A, ROW_NUMBER() OVER(ORDER BY 确认好的排序字段) AS row_num FROM CWAUL.SA080VMF ) UPDATE update_data SET FLD01A = 'PERCENT ACHIEVED MONTH' WHERE row_num = 2 AND FLD01A = 'PERCENT ACHIEVED'
内容的提问来源于stack exchange,提问作者Mark
相关产品推荐
相关产品推荐

