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)不能有相同的“名称”列。这只是很少的记录,但我的真实数据很大,我希望系统只在表#XYZ 中生成具有 2 个字符的新名称,这些名称在 #ABC 中已经不被相同的 ID 占用。任何帮助表示赞赏。谢谢

4

1 回答 1

0

I added another temp table #DEF to hold the Names you're generating from NEWID(). It's a little clearer to use SUBSTRING('123456', 1, 2) to obtain the first two characters. I also added a GROUP BY ID so that it will generate only one Name per ID.

Finally, I used a LEFT JOIN and a NULL match to look for #DEF entries that were not already present in #ABC.

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

Does this work for you?

于 2013-05-07T18:37:22.233 回答