我正在使用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行有重复,所以手工做不是一个选项。
关于从哪里开始的任何想法?
答案 0 :(得分:0)
如果这是一次性交易,你将在完成后创建一个独特的约束:
创建临时表 选择名称 从表 按名称分组 有计数(*)> 1
设置rowCount = 1 更新基表 在temp.name = base.name上连接临时表 set name = name +'(1)'
重复直到完成 删除所有(1)条目
抱歉,您需要自己编写真正的SQL。如果您有SQL2K5,可以使用Row_Number()来执行此操作。
答案 1 :(得分: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
答案 2 :(得分: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]))