sql - 更新表中的重复字段

标签 sql sql-server tsql sql-server-2008-r2 sql-update

我有大约 100000 条记录的表。我需要像这样更新相同的字段。 例如这是我的 table

id     name
 1     sss
 2     bbb
 3     ccc
 4     avg
 5     bbb
 6     bbb
 7     sss
 8     mmm
 9     avg

执行脚本后我需要get

id     name
 1     sss
 2     bbb
 3     ccc
 4     avg
 5     bbb-5
 6     bbb-6
 7     sss-7
 8     mmm
 9     avg-9

我该怎么做?

最佳答案

通过使用CTE

WITH greaterRecord 
AS 
(
    SELECT  id, 
            name, 
            ROW_NUMBER() OVER(PARTITION BY name ORDER BY id) RN
    FROM    TableName
)
UPDATE greaterRecord
SET    name = name + '-' + CAST(id AS VARCHAR(10))
WHERE  RN > 1

这是适用于大多数 RDBMS 的常见查询

UPDATE  a
SET     a.Name = a.Name + '-' + CAST(ID AS VARCHAR(10))
FROM    tableName a
        LEFT JOIN
        (
            SELECT  MIN(ID) min_ID, name
            FROM    tableName
            GROUP   BY name
        ) b ON  a.name = b.name AND
                a.ID = b.Min_ID
WHERE   b.Name IS NULL

更新语句执行后的输出

╔════╦═══════╗
║ ID ║ NAME  ║
╠════╬═══════╣
║  1 ║ sss   ║
║  2 ║ bbb   ║
║  3 ║ ccc   ║
║  4 ║ avg   ║
║  5 ║ bbb-5 ║
║  6 ║ bbb-6 ║
║  7 ║ sss-7 ║
║  8 ║ mmm   ║
║  9 ║ avg-9 ║
╚════╩═══════╝

关于sql - 更新表中的重复字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15682877/

相关文章:

c# - Entity Framework 和默认值

sql - 如何替换SQL Azure中的内置函数pwdcompare?

mysql - 如何在 SQL 中获取每组的平均值并找出异常值

mysql - 使用带有日期字符串的 LIKE 子句进行查询

sql-server - 如何将运行时mssql错误存储在变量中并继续在perl中运行?

sql - T-SQL- Sum over Partition by 结合 group by

mysql - 如何使用 CURDATE() 作为列名

sql-server - 连接所有参数并在存储过程中生成字符串?

sql-server - SQL 按一个字段分组并按另一字段排序

sql - WHERE ID IN (1, 2, 3, 4, 5, ...) 是最有效的吗?