根据同一表中另一列的值更新(重命名)列的值 - T-SQL



我正在尝试根据同一表中的另一列重命名一列。示例 - 我有一个表格如下

Row#    Name      Date            id
-------------------------------------
1      aaa      2018-03-02      Null
2      aaa      2018-03-02      123
3      aaa      2018-03-02      456
4      bbb      2019-07-05      Null
5      bbb      2019-07-05      Null
6      bbb      2019-07-05      345

在这里,我想检查名称和发送日期是否匹配 - 如果条件匹配且 Id 均为 NULL,则名称没有变化,但如果 id 不是 NULL,那么我想将"名称"字段重命名为"aaa(临时("在同一个表中。 我不确定如何比较id字段并重命名表,如果它不是NULL(无论值是什么(,下面是我期望的解决方案(因为名称和日期相同,但第2行和第3行中的ID不是NULL(

Row#    Name          Date            id
-------------------------------------------
1      aaa          2018-03-02      Null
2      aaa(Temp)    2018-03-02      123
3      aaa(Temp)    2018-03-02      456
4      bbb          2019-07-05      Null
5      bbb          2019-07-05      Null
6      bbb(Temp)   2019-07-05       345

您可以使用内部联接进行更新

UPDATE e1 SET name = CONCAT(e1.name,' ( Temp )')
FROM #example e1
INNER JOIn #example e2
ON e2.name = e1.name
AND e2.date = e1.date
WHERE e1.id IS NOT NULL

但是由于您没有每一行的唯一标识符,因此还将更新不匹配的行,因此 bc 每行都将与自身匹配。

如果你有uid很容易

UPDATE e1 SET name = CONCAT(e1.name,' ( Temp )')
FROM #example e1
INNER JOIN #example e2
ON e2.name = e1.name
AND e2.date = e1.date
AND e2.id_row <> e1.id_row
WHERE e1.id is not null

如果您实际上没有唯一标识符,则可以使用此查询轻松添加它

ALTER TABLE #example ADD id_row INT IDENTITY NOT NULL

您可以使用existscase

select t.*, 
(case when id is not null and 
exists (select 1 from t t2 where t2.name = t.name and t2.date = t.date and t2.id is null)
then concat(name, '(Temp)')
else name
end) as new_name
from t;

如果要更新该值,可以使用可更新的 CTE:

with toupdate as (
select t.*, 
(case when id is not null and 
exists (select 1 from t t2 where t2.name = t.name and t2.date = t.date and t2.id is null)
then concat(name, '(Temp)')
else name
end) as new_name
from t
)
update toudpate
set name = new_name
where name <> new_name;

您也可以将其表述为:

update t
set name = concat(name, '(Temp)')
where t.id is not null and
exists (select 1 from t t2 where t2.name = t.name and t2.date = t.date and t2.id is null);

最新更新