更新sql server数据库表中的2个重复项之一

Moh*_*edT 19 sql sql-server

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

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

UPDATE Table1
   SET Column1 = 'a'
 WHERE exists
       (SELECT Column1 , COUNT(Column1 )
FROM Clients
GROUP BY Column1 
HAVING ( COUNT(Column1 ) > 1)
)
Run Code Online (Sandbox Code Playgroud)

Nit*_*esh 41

试着用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
Run Code Online (Sandbox Code Playgroud)

  • 您不想更新“客户”表而不是“cte”(这只是临时的事情)吗?PostgreSQL 拒绝了这种语法。我最终得到的结果更像是: UPDATE Clients SET Column1 = Column1 + ' 1 ' WHERE cte.rno = 2; (3认同)
  • 下选民请解释原因 (2认同)

Joa*_*son 7

我认为这个简单的更新是您正在寻找的;

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

输入:

(1,'A'),
(2,'B'),
(3,'A'),
(4,'C'),
(5,'C'),
(6,'A');
Run Code Online (Sandbox Code Playgroud)

输出:

(1,'A'),
(2,'B'),
(3,'A3'),
(4,'C'),
(5,'C5'),
(6,'A6');
Run Code Online (Sandbox Code Playgroud)

一个要测试的SQLfiddle.


MZT*_*MZT 5

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

UPDATE TOP ( 1 )Table1 SET Column1 = 'a';
Run Code Online (Sandbox Code Playgroud)

  • 请确定你的答案。通常,答案中的“我认为”会使您的答案不太可能被选中。 (2认同)

Mic*_*eph 5

如果我们有这样的条件:

SELECT Column1 FROM Clients ORDER BY Column1

Column1
**********
Jhon
Jhon
Mike
Mike
Mike
Robert
Run Code Online (Sandbox Code Playgroud)

即使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 
Run Code Online (Sandbox Code Playgroud)

结果:

Column1
***********
Jhon
Jhon 1
Mike
Mike 1
Mike 2
Robert
Run Code Online (Sandbox Code Playgroud)