生成未采用的新ID

时间:2013-05-07 17:50:01

标签: sql

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占用。任何帮助表示赞赏。谢谢

1 个答案:

答案 0 :(得分:0)

我添加了另一个临时表#DEF来保存您从NEWID()生成的名称。使用SUBSTRING('123456',1,2)来获得前两个字符更清楚一些。我还添加了一个GROUP BY ID,以便每个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

这对你有用吗?