T-SQL: как сделать значения ячеек уникальными? - PullRequest
2 голосов
/ 01 декабря 2008

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

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

Peter
Peter
Peter
Dave
Dave

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

Peter
Peter1
Peter2
Dave
Dave1

Что такое T-SQL для SQL Server, чтобы сделать это?

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

Ответы [ 2 ]

5 голосов
/ 01 декабря 2008

РЕДАКТИРОВАТЬ: я изменил запрос, чтобы использовать ваши имена полей и добавил запрос "только для выбора" для предварительного просмотра.

Это на самом деле довольно легко сделать ... просто используйте 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
0 голосов
/ 08 декабря 2008

Это похоже на довольно понятный сценарий использования триггера (вставка, обновление).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...