27

我有一个表,其中有一列具有重复值。我想更新 2 个重复值之一,例如row1 = tomrow2 = tom.. 我想向其中一个添加 1 或 a ,这将用于同一列中的许多其他重复项。基本上只需在每个重复项中添加一个数字或字母,这样就不会再有重复项了。

我得到了这个查询,它将更新所有重复项,但不会更新其中一个。任何人都可以帮忙吗?

UPDATE Table1
   SET Column1 = 'a'
 WHERE exists
       (SELECT Column1 , COUNT(Column1 )
FROM Clients
GROUP BY Column1 
HAVING ( COUNT(Column1 ) > 1)
)
4

13 回答 13

57

试试这个CTEPARTITION BY

;WITH cte AS
(
  SELECT
      ROW_NUMBER() OVER(PARTITION BY Column1  ORDER BY Column1 ) AS rno,
      Column1 
  FROM Clients
)

UPDATE cte SET Column1 =Column1 +' 1 '
WHERE rno=2
于 2013-07-22T09:49:59.843 回答
13

我认为这个简单的更新正是您想要的;

UPDATE Table1 SET Column1=Column1+CAST(id AS VARCHAR)
WHERE id NOT IN (
  SELECT MIN(id) 
  FROM Table1
  GROUP BY Column1
);

输入:

(1,'A'),
(2,'B'),
(3,'A'),
(4,'C'),
(5,'C'),
(6,'A');

输出:

(1,'A'),
(2,'B'),
(3,'A3'),
(4,'C'),
(5,'C5'),
(6,'A6');

一个用于测试的 SQLfiddle

于 2013-07-22T09:42:49.103 回答
6

我认为您可以使用 TOP() 运算符而不是 row_number() 方法,它将帮助您以简单易行的方式更新一个

UPDATE TOP ( 1 )Table1 SET Column1 = 'a';
于 2013-07-22T11:31:25.203 回答
3

假设Table1,包含以下信息:

Column1      
========  
tom        
john   
jack    
tom     
james
jane 

请注意,第一行和第四行是相同的。这是UPDATE仅在其中一个中更改名称的命令。

UPDATE Table1 AS t1
   SET Column1 = 'jennifer'
 WHERE rrn(t1) =
       (SELECT MAX(rrn(t2))
          FROM Table1 AS t2
         WHERE Column1 = 'tom')

结果将是

Column1      
========  
tom        
john   
jack    
jennifer
james
jane 

使用RRN功能,您可以更新最后一次出现的重复记录

于 2013-07-22T09:30:22.437 回答
3

如果我们有这个条件:

SELECT Column1 FROM Clients ORDER BY Column1

Column1
**********
Jhon
Jhon
Mike
Mike
Mike
Robert

即使Column1重复 n 次,这也可以工作,它会将行号附加到除第一行之外的每个重复行,试试这个:

BEGIN 

;WITH CTE AS 
(
    SELECT 
        ROW_NUMBER() OVER (PARTITION BY Column1 ORDER BY Column1) AS ROWNUMBER,
        Column1
    FROM Clients
)

UPDATE CTE 
SET Column1 = CONCAT(Column1, ' ', (ROWNUMBER - 1))
WHERE ROWNUMBER > 1

SELECT Column1 FROM Clients ORDER BY Column1

END 

结果:

Column1
***********
Jhon
Jhon 1
Mike
Mike 1
Mike 2
Robert
于 2019-06-21T16:07:28.850 回答
1

试试这个

with test as 
(
   select ROW_NUMBER() over (order by salary)rr, salary , emp_no 
   from salary
)update test set emp_no=10007 where emp_no='10002'  and rr=3
于 2018-05-03T05:20:16.303 回答
0

试试这个伙伴

UPDATE Table1 
SET Column1 = column1 +'a'   
WHERE exists(
        select row 
        from (
            SELECT 
                Column1 , 
                Row_Number() over(Partition by Column1 order by Column1) as row 
            FROM Clients
        ) as subquery 
        where subquery.row = 2
    )
于 2013-07-22T09:30:57.047 回答
0

由于我的 sql 开发人员不喜欢从 Nithesh 的答案中复制更新 a

它最终看起来像这样:

UPDATE Clients 
SET Column1 = 'a'
WHERE ColumnID IN (select ColumnID from 
 (  
 SELECT
       row_number() OVER(PARTITION BY Column1  ORDER BY Column1 ) AS rno,
       ColumnID FROM Clients
 )
                   where rno=2   
                  )
于 2018-01-18T10:30:47.643 回答
0

使用子查询可能有效:

UPDATE table1
SET STATUS = 'F'
WHERE column1= 
   (SELECT (column1)
    FROM table1
    GROUP BY column1 
    HAVING (COUNT(column1 ) > 1))
于 2018-08-07T12:34:47.507 回答
0
update wmwhse1.sku
set descr= concat (descr,'.')
where exists
(select SKU,count (DESCR)
from wmwhse1.sku
group by descr
having (count (DESCR)>1))

当我运行此脚本时,所有 sku 描述都在更新。

输出:应该只影响 1 行

于 2020-01-13T09:10:05.897 回答
0

我找到了这个解决方案:

我的桌面设备已经有数据,并且“串行”列应该是唯一的。“id”是主键。在原始值之后连接一个随机的 6 位值。

UPDATE devices 
SET serial=CONCAT(serial,'_',LPAD(FLOOR(RAND() * 999999.99), 6, '0'))    
    where id in 
    (select * FROM( 
        SELECT d1.id as id 
        FROM devices as d1, devices as d2 
        WHERE d1.id <> d2.id and d1.serial=d2.serial) as subdevices
    )
于 2020-02-27T17:47:44.773 回答
0

免责声明:

  1. 查询语言:Microsoft SQL 查询
  2. 步骤在以下评论中得到澄清:-

问题:用“D”更新最后一个 ID,其中年、月是重复的成员。

-- Sample Table Creation

DECLARE @TempTable TABLE
( Id INT IDENTITY (1, 1) NOT NULL, MemberId INT, for_year INT, for_month INT, for_status CHAR(1) )

-- Sample Insert
INSERT INTO @TempTable
SELECT '2', '2077', '11', 'A' UNION ALL
SELECT '2', '2077', '12', 'A' UNION ALL
SELECT '2', '2077', '12', 'A' UNION ALL
SELECT '3', '2077', '11', 'A' UNION ALL
SELECT '3', '2077', '12', 'A' UNION ALL
SELECT '3', '2077', '12', 'A' UNION ALL
SELECT '77', '2076', '10', 'A' UNION ALL
SELECT '77', '2076', '11', 'A' UNION ALL
SELECT '77', '2076', '12', 'A'

-- where expectation meets reality :) -- logic / main query
UPDATE @TempTable SET for_status = 'D' WHERE Id IN 
(
SELECT MAX(Id) FROM @TempTable GROUP BY MemberId, for_year, for_month HAVING COUNT(*)>1
)

-- Sample Select
SELECT * FROM @TempTable
于 2021-01-08T14:06:11.783 回答
0

我找到了一种解决方案:

在表中插入一个虚拟列

更新列中的值并给出随机值

使用该虚拟列的值更新该行并删除该列。

Step 1 :
Alter table table_name
ADD column dummy_column

Step 2:
Update table_name
SET dummy_column = (RAND() * 10) 
where duplicate_column = duplicate_value

Step 3:
Update table_name
SET duplicate_column = new_value
where dummy_column = random_value

Step 4:
Alter table table_name
drop column dummy_column
于 2021-08-06T10:15:14.923 回答