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

时间:2020-07-02 01:09:28

标签: sql-server tsql

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

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

2 个答案:

答案 0 :(得分:1)

您可以使用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);

答案 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