2009-01-14 115 views
35

我試着在這裏搜索類似的解決方案,但沒有看到一個,所以我想知道什麼是完成以下的最佳方法。在表中爲每個ID在另一個表中插入行

我有一張有1700萬行的表格,都有一個唯一的ID。我們最近創建了一個新表,與新表的外鍵是舊錶的唯一標識一起使用。

例如,
表1 - ID,字段1,字段2,字段3 ... 表2 - table1.id,字段1 ...

的問題,因爲我們遷移到實際環境中,我們需要回填表2,其中包含表1中每行的id的行。 ex,表1-1,test,null 表2現在需要具有:1,null,...以此類推在table1中。主要問題是表1中的ID不是全部順序,所以我們必須從表1讀取,然後根據找到的ID插入到表2中。

有沒有更簡單的方法可以解決這個問題? 在此先感謝 喬

而且澄清,表2將新的數據和它將包含從表1中的唯一的事情就是保持外鍵關係

的ID另外這是SQL Server 2000中

回答

4

您需要閱讀這篇文章。

What are the most common SQL anti-patterns?

的主要問題是,IDS是不是在表中的所有連續的1,所以我們必須從表1看,然後插入基於的發現爲表2

的id

是的,看看我在上面的文章中的答案,並使用Item#2編寫一個鍵循環循環。

確保在編寫插入語句時,您提供了一個字段列表 - 正如我在項目#1中所述。

11

我不確定我是否正在關注你,但是會爲你工作嗎?

INSERT INTO table2 (SELECT field1, field2, field3... FROM table1) 

如果我理解正確,您希望table1中的每條記錄都有一條記錄。這將做到這一點。只需按照正確的順序在select中匹配您的字段,然後爲table2中的任何字段指定常量,這些字段在table1中不存在。

HTH。讓我知道如果我不理解,我會再次嘗試幫助。

+0

是否在SQL服務器這句法工作?嘗試時,我得到一個錯誤,說「錯誤附近選擇」 – Trevor 2013-07-29 14:19:51

-1

有了這麼多行,您可能會遇到事務日誌空間和運行大型插入事務的時間長度問題。

如果運行時間是一個約束我會認真地建議使用BCP(或取決於平臺什麼都工具適用)

選擇出的ID從原始表,用它來建立一個BCP文件的擴展表,然後Bcp它。

很多人發現它更高性能的Bcp在10,000記錄的文件,而不是一個17000000行的humungus文件。

此外,您可以在上線前在背後做這件事,然後編寫一份t-sql作業以便在拿到id的snapshop後插入。

44

如果我理解正確,您希望table1中的每條記錄都有一條記錄。 另外我相信除了對table1的引用之外,table2最初應該包含空行。

因此,假設

table1 (ID, field1, field2, ...) 
table2 (ID, table1_ID, fieldA, fieldB,...) 
-- where table1_ID is a reference to ID of table1 

創建表2以後,就可以運行這個插入語句

insert into table2(table1_ID) 
select ID from table1 
相關問題