我正在尝试根据同一表中的另一列重命名一列。示例-我有一个下表,
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(temp)”。 我不确定下面的id字段是否为NULL(与值无关)如何比较ID字段并重命名表,这是我期望的解决方案(因为名称和日期相同,但第2行和3不是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
答案 0 :(得分:1)
您可以使用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);
答案 1 :(得分:1)
您可以使用内部联接进行更新
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
但是因为您没有唯一的标识符,所以每行将同时更新不匹配的行,因此每行都将与自身匹配。
如果您有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