2013-05-07 154 views
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使用。任何幫助表示讚賞。謝謝生成未採用的新ID

回答

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 

這是否適合您?

+0

它處理了它不會生成#ABC中已存在的ID的部分,但它正在生成重複的新ID。比如說ID = 1,兩次產生'02'和'02'。謝謝! – 2013-05-07 19:03:55

+0

是的,如果您使用NEWID()作爲隨機數生成器,並且生成一大堆隨機數,則會得到重複數據。我的代碼假設您在將它們插入#ABC之前一次檢查它們。我更新了我的答案以添加GROUP BY#DEF.ID,#DEF.Name。你也可以使用DISTINCT。這應該有助於消除重複。 – criticalfix 2013-05-07 19:15:58

+0

漏洞:如果我在表#DEF中使用DISTINCT,那麼如果#ABC中存在相同的名稱,我們就不能獲取所有值。假設ID = 1,我們在#ABC中有50條記錄,有少於50條記錄被插入到#DEF中,因此在#XYZ中。我們需要與#ABC中相同數量的記錄。謝謝 – 2013-05-07 22:13:47