2008-12-01 4 views
2

Если у меня есть таблица, где ячейки в столбце не должны иметь одинаковые значения, как это проверить и обновить? (Я знаю, я могу установить ограничения в настройках, но я не хочу, чтобы сделать это.)T-SQL: как сделать значения ячейки уникальными?

Произнесите имя столбца называется уникальный хэш имя и содержит

 
Peter 
Peter 
Peter 
Dave 
Dave 

и так далее. Я хочу, чтобы это преобразование в:

 
Peter 
Peter1 
Peter2 
Dave 
Dave1 

Для чего нужен T-SQL для SQL Server?

Обновление: Для большей ясности назовем таблицу «Лица» и ячейку, в которой я хочу уникальное «Уникальное имя». Не могли бы вы сделать его SELECT-оператором, поэтому я могу проверить результат перед обновлением. И я использую SQL Server 2005 и выше.

+0

Является ли это SQL Server 2005? Если это так, вы просто запустите инструкцию «внутренний выбор» моего очень простого и чистого примера ниже ... у вас будет то, что вы хотите. – 2008-12-01 18:20:25

+0

Чтобы получить более быстрый ответ, вы должны указать свою версию SQL Server (2000, 2005). – 2008-12-01 18:29:37

ответ

5

EDIT: Я изменил запрос, чтобы использовать ваши имена полей, и добавил запрос «только для выбора» для предварительного просмотра.

Это на самом деле очень легко сделать ... просто использовать 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 

EDIT снова: Если вы ищете для 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 
0

Это выглядит как довольно чистый случай использования для trigger (вставка, обновление).

Смежные вопросы