代码之家  ›  专栏  ›  技术社区  ›  Seb Nilsson

T-SQL:如何使单元格值唯一?

  •  2
  • Seb Nilsson  · 技术社区  · 16 年前

    如果我有一张桌子 列中的单元格不应具有相同的值 ,如何检查并更新?(我知道我可以在设置中设置约束,但我不想这样做。)

    假设列名被调用 唯一哈希名称 包含

    Peter
    Peter
    Peter
    Dave
    Dave
    

    等等。我想把它转换成:

    Peter
    Peter1
    Peter2
    Dave
    Dave1
    

    SQL Server要做什么?

    更新 :为了清楚起见,让我们将表称为“persons”,并将单元格称为唯一的“uniquename”。你能不能做一个select语句,这样我可以在更新之前测试结果。我正在使用 SQL Server 2005及更高版本 .

    2 回复  |  直到 16 年前
        1
  •  5
  •   Timothy Khouri    16 年前

    编辑:我已将查询更改为使用您的域名,并添加了一个“仅选择”查询供您预览。

    这其实很容易做到…只需将row_number()与partition子句一起使用:

    UPDATE Persons SET UniqueName = temp.DeDupded FROM
        (SELECT ID,
            CASE WHEN ROW_NUMBER() OVER
                (PARTITION BY UniqueName ORDER BY UniqueName) = 1 THEN UniqueName
            ELSE UniqueName + CONVERT(VARCHAR, ROW_NUMBER()
                OVER (PARTITION BY UniqueName ORDER BY UniqueName)-1) END AS DeDupded
        FROM Persons) temp
    WHERE Persons.ID = temp.ID
    

    如果您想要一个“仅选择”,那么这里是:

    SELECT ID,
        CASE WHEN ROW_NUMBER() OVER
            (PARTITION BY UniqueName ORDER BY UniqueName) = 1 THEN UniqueName
        ELSE UniqueName + CONVERT(VARCHAR, ROW_NUMBER()
            OVER (PARTITION BY UniqueName ORDER BY UniqueName)-1) END AS DeDupded
    FROM Persons
    

    再次编辑:如果要查找SQL Server 2000解决方案…

    CREATE TABLE #Persons ( ID INT IDENTITY(1, 1), UniqueName VARCHAR(100) )
    
    INSERT INTO #Persons VALUES ('Bob')
    INSERT INTO #Persons VALUES ('Bob')
    INSERT INTO #Persons VALUES ('Bob')
    INSERT INTO #Persons VALUES ('John')
    INSERT INTO #Persons VALUES ('John')
    
    SELECT
        ID,
        CASE WHEN Position = 0 THEN UniqueName
            ELSE UniqueName + (CONVERT(VARCHAR, Position))
        END AS UniqueName
    FROM
        (SELECT
            ID,
            UniqueName,
            (SELECT COUNT(*) FROM #Persons p2 WHERE
                p1.UniqueName = p2.UniqueName AND p1.ID > p2.ID) AS Position
        FROM
            #Persons p1) _temp
    
    DROP TABLE #Persons
    
        2
  •  0
  •   annakata    16 年前

    这就像是一个非常清晰的 trigger (插入,更新)。