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占用。任何帮助表示赞赏。谢谢
答案 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
这对你有用吗?