0

我正在使用 SQL Server 2000,我有一种情况,我将数据从一个表复制到另一个表,目标数据表要求每个 Name 行都是唯一的。这是我的问题的一个简单示例

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)

Name 列是一个 varchar(40),关于如何处理它的任何想法,我有 2561 行有重复项,所以手工操作不是一种选择。

关于从哪里开始的任何想法?

4

3 回答 3

0

如果这是一次交易,并且您将在完成后创建一个唯一约束:

通过具有 count(*) > 1 的名称从表组中创建一个临时表选择名称

set rowCount=1 update base table join temp table on temp.name=base.name set name = name + '(1)'

重复直到完成删除所有 (1) 个条目

抱歉,您需要自己编写真正的 SQL。如果您有 SQL2K5,则可以使用 Row_Number() 来执行此操作。

于 2010-02-22T17:46:17.203 回答
0

您将需要一个光标。

如下所示:

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
于 2010-02-22T17:57:21.103 回答
0

我决定不需要每次都从 1 开始,所以我决定复制产品末尾的行 ID 列的内容。

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]))
于 2010-02-22T19:26:38.507 回答