1
DROP TABLE #ABC
CREATE TABLE #ABC (ID INT, Name VARCHAR (2))
INSERT INTO #ABC (ID, NAME)
VALUES (1,'01'),(1,'F5'),(1,'05'),(2,'08'),(2,'G4'),(3,'Y7'),(3,'18') 

drop table #XYZ
CREATE TABLE #XYZ (ID INT, Name char(20))
INSERT INTO #XYZ (ID,Name)
SELECT ID, SUBSTRING(REPLACE(CONVERT(VARCHAR(36), NEWID()) , '-', ''), 0, 3)  from #ABC

Select * from #XYZ

同じ ID でまだ使用されていない新しい名前を作成するプロセスが必要です。つまり、同じ ID (たとえば ID =1) が同じ「名前」列を持つことはできません。これはごく少数のレコードですが、私の実際のデータは膨大です。#ABC の同じ ID によって既に取得されていないテーブル #XYZ の 2 文字の新しい名前のみをシステムに生成させたいと考えています。どんな助けでも大歓迎です。ありがとう

4

1 に答える 1

0

NEWID() から生成する名前を保持するために、別の一時テーブル #DEF を追加しました。SUBSTRING('123456', 1, 2) を使用して最初の 2 文字を取得する方が少し明確です。ID ごとに 1 つの名前のみを生成するように、GROUP BY ID も追加しました。

最後に、LEFT JOIN と NULL 一致を使用して、#ABC にまだ存在していない #DEF エントリを探しました。

DROP TABLE #ABC
CREATE TABLE #ABC (ID INT, Name VARCHAR (2))
INSERT INTO #ABC (ID, NAME)
VALUES (1,'01'),(1,'F5'),(1,'05'),(2,'08'),(2,'G4'),(3,'Y7'),(3,'18') 

DROP TABLE #DEF
CREATE TABLE #DEF (ID INT, Name char(20))
INSERT INTO #DEF (ID, Name)
SELECT ID, SUBSTRING(REPLACE(CONVERT(VARCHAR(36), NEWID()) , '-', ''), 1, 2) AS Name 
FROM #ABC
GROUP BY ID

DROP TABLE #XYZ
CREATE TABLE #XYZ (ID INT, Name char(20))
INSERT INTO #XYZ (ID, Name)
SELECT #DEF.ID, #DEF.Name 
FROM #DEF
LEFT JOIN #ABC ON #ABC.ID = #DEF.ID AND #ABC.Name = #DEF.Name
WHERE #ABC.ID IS NULL
GROUP BY #DEF.ID, #DEF.Name

SELECT * FROM #XYZ

これはうまくいきますか?

于 2013-05-07T18:37:22.233 に答える