Добавление текста в поле, чтобы сделать его уникальным - PullRequest
0 голосов
/ 22 февраля 2010

Я использую SQL Server 2000, у меня возникает ситуация, когда я копирую данные из одной таблицы в другую, таблица назначения требует, чтобы каждая строка имени была уникальной. Вот краткий пример моей проблемы

Source table
RowID | Name
1       A
2       B
3       B
4       B
5       C
6       D
7       C

То, что я хочу сделать, это превратить его в это

Destination table
RowID | Name
1       A
2       B
3       B(2)
4       B(3)
5       C
6       D
7       C(2)

Столбец «Имя» - это varchar (40), любая идея о том, как это сделать, у меня есть 2561 строка, в которой есть дубликаты, поэтому делать это вручную нельзя.

Есть идеи, с чего начать?

Ответы [ 3 ]

0 голосов
/ 22 февраля 2010

Вам понадобится курсор.

Примерно так:

CREATE TABLE TempTable ( RowID INT IDENTITY PRIMARY KEY, SomeValue varchar(10))
INSERT INTO TempTable (SomeValue) VALUES( 'A')
INSERT INTO TempTable (SomeValue) VALUES( 'B')
INSERT INTO TempTable (SomeValue) VALUES( 'B')
INSERT INTO TempTable (SomeValue) VALUES( 'B')
INSERT INTO TempTable (SomeValue) VALUES( 'C')
INSERT INTO TempTable (SomeValue) VALUES( 'C')
INSERT INTO TempTable (SomeValue) VALUES( 'D')
INSERT INTO TempTable (SomeValue) VALUES( 'D')
INSERT INTO TempTable (SomeValue) VALUES( 'D')
INSERT INTO TempTable (SomeValue) VALUES( 'D')


CREATE TABLE #Counts (SomeValue varchar(10), ValCount int CONSTRAINT COunts_Unique UNIQUE(SomeValue))
INSERT INTO #Counts(SomeValue, ValCount)
SELECT DISTINCT SomeValue, 0 FROM TempTable

DECLARE @RowID int
DECLARE @SomeValue VARCHAR(10)
DECLARE @ValCount int
DECLARE curs CURSOR for SELECT RowID, SomeValue FROM TempTable ORDER BY RowID ASC
OPEN curs
FETCH NEXT FROM curs into @RowID, @SomeValue
WHILE(@@FETCH_STATUS = 0)
BEGIN
    SELECT @ValCount = ValCount FROM #Counts WHERE SomeValue = @SomeValue
    IF(@ValCount > 0)
    BEGIN
        UPDATE TempTable 
        SET SomeValue = SomeValue + '(' + Convert(varchar, @valCount) + ')'
        WHERE RowID = @RowID
    END

    UPDATE #Counts SET ValCount = ValCount + 1 where SomeValue = @SomeValue

    FETCH NEXT FROM curs into @RowID, @SomeValue
END
CLOSE curs
DEALLOCATE curs

DROP TABLE #Counts
0 голосов
/ 22 февраля 2010

Я решил, что мне не нужно начинать с 1 каждый раз, поэтому я просто решил скопировать содержимое столбца идентификатора строки в конце продукта.

update #Inv
set name = left(rtrim(name), 40-len(RowId)-1) + ' ' + RowId
where name in (SELECT distinct name
               FROM [#Inv] a
               WHERE exists (select [name] from [#Inv] where not [RowId] = a.[RowId] and [name] = a.[name]))
0 голосов
/ 22 февраля 2010

Если это разовая сделка, и вы собираетесь создать уникальное ограничение, когда закончите:

создать временную таблицу выберите имя из таблицы группа по имени имеющий количество (*)> 1

set rowCount = 1 обновить базовую таблицу присоединиться к временной таблице на temp.name = base.name установить имя = имя + '(1)'

повторить, пока не будет сделано удалить все (1) записи

Извините, вам нужно написать настоящий SQL самостоятельно. Если у вас был SQL2K5, вы могли бы использовать Row_Number () для этого.

...