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

Posted

技术标签:

【中文标题】T-SQL:如何使单元格值唯一?【英文标题】:T-SQL: How to make cell-values unique? 【发布时间】:2008-12-01 09:53:48 【问题描述】:

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

假设列名被称为唯一哈希名并且包含

彼得 彼得 彼得 戴夫 戴夫

等等。我希望将其转换为:

彼得 彼得1 彼得2 戴夫 戴夫1

SQL Server 的 T-SQL 是什么?

更新:为清楚起见,我们将表格命名为“Persons”,将我想要唯一的单元格命名为“UniqueName”。你能不能让它成为一个 SELECT 语句,所以我可以在更新之前测试结果。我正在使用 SQL Server 2005 及更高版本

【问题讨论】:

这是 SQL Server 2005 吗?如果是这样,您只需运行下面我非常简单和干净的示例的“内部选择”语句......您将拥有您想要的。 您应该指定您的 SQL Server 版本(2000、2005)以获得更快的响应。 此时无论哪种方式都无所谓...我已经发布了 2000 和 2005 的解决方案... 2000 的解决方案适用于两个版本(以及 sql 7 和 2008...为什么不是)。 @Seb:至少对我来说,这个问题误导了它的原始状态,我把它改成更接近你想要的。如果您愿意,请回滚。 【参考方案1】:

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

这实际上很容易做到...只需将 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

【讨论】:

你应该提到这只是 SQL Server 2005 和更高版本。 也许您应该对不起作用的解决方案投反对票,而不是那些您碰巧不喜欢的解决方案。如果您想为某件事感到自豪,请继续构建一个简单并且适用于 SQL Server 2000 的解决方案。 没错,您的解决方案确实产生了最终的结果,但答案会因其手段和目的而被投票。 谈论手段 - 您的解决方案处理。我认为问题在于中的数据是否相同。 顺便说一句,我意识到这听起来很棘手(我为此道歉)。你显然很擅长使用 SQL(查看你的帖子),所以我认为我对你的帖子有点苛刻。对我来说,看到“你必须使用光标”就像斗牛士在公牛面前挥舞斗篷。【参考方案2】:

对于trigger(插入、更新)来说,这感觉像是一个非常清晰的用例。

【讨论】:

以上是关于T-SQL:如何使单元格值唯一?的主要内容,如果未能解决你的问题,请参考以下文章

是否可以使用 excel 单元格值 - 作为 T-SQL 语句中的参考?

如何使 JTable 单元格不可编辑但应该能够选择和复制当前单元格中的值

如何基于单个单元格值格式化整个列?

渲染器使单元格相对于其他单元格值只读后的 JQuery handsontable - 不起作用

赢表格。使用 BindingNavigator 时如何使 DataGridView 写入单元格值

根据单元格值合并范围内的单元格,但最后一个单元格没有被合并