我正在尝试根据同一表中的另一列重命名一列。示例 - 我有一个表格如下
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
您可以使用exists
和case
:
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);