0

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)

Name 列は varchar(40) です。どのように行うかについてのアイデアはありません。重複する行が 2561 行あるため、手動で行うことはできません。

どこから始めるべきかについてのアイデアはありますか?

4

3 に答える 3

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 に答える
0

1 回限りの取引で、完了時に一意の制約を作成する場合:

一時テーブルを作成し、count(*) > 1 を持つ名前でテーブル グループから名前を選択します

set rowCount=1 ベース テーブルの更新 temp.name=base.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 に答える