Sql 将表复制到两个新表中
我有一个丑陋的SQL Server 2014表,其中包含书籍。每本书都可以由多个作者撰写,因此一本书可以在表格中重复多次,每个作者一行。ISBN字段唯一标识图书 数据如下所示:Sql 将表复制到两个新表中,sql,sql-server,database,Sql,Sql Server,Database,我有一个丑陋的SQL Server 2014表,其中包含书籍。每本书都可以由多个作者撰写,因此一本书可以在表格中重复多次,每个作者一行。ISBN字段唯一标识图书 数据如下所示: TABLE NAME = "OldUglyTable" ID ISBN BookTitle AuthorName 1 1 My Awesome Book John Smith 2 1 My Awesome Book
TABLE NAME = "OldUglyTable"
ID ISBN BookTitle AuthorName
1 1 My Awesome Book John Smith
2 1 My Awesome Book Sally Johnson
3 2 All About Cats Frank Jones
4 1 My Awesome Book A. Smithfield
我们现在所做的是创建了两个新的空表Books
(自动递增BookID
,ISBN
(唯一键)和BookTitle
)和BookAuthors
(自动递增ID
,BookID
(FK toBooks
),AuthorName
)。原始的ID
字段是垃圾,我们并不真正关心它
我无法更改表结构,但我正试图通过在Books
表中为每个唯一的ISBN
创建一条记录,将记录快速移动到这两个表中,然后在BookAuthors
表中为每个作者创建一条记录,该记录在Books
中的BookID
字段上有一个FK输出到刚刚在Books
中创建的新记录
如何有效地将这些数据拆分为这两个新表,并将FK插入到BookAuthors
中
我有超过6000万行!我尝试在ISBN上进行行号分区,只从CTE中获取第一行,因为DISTINCT
不一定总是返回正确的数据,但这甚至给了我
'System.OutOfMemoryException System.OutOfMemoryException'
SSMS中的错误:(我不确定最好的方法是什么。首先,
使用此查询将不同的图书插入图书
表:
INSERT INTO Books(ISBN, BookTitle)
SELECT DISTINCT
ISBN, BookTitle
FROM OldUglyTable
然后,使用内部联接将作者插入书籍作者:
INSERT INTO BookAuthors(BookID, AuthorName)
SELECT
b.BookID, t.AuthorName
FROM OldUglyTable t
INNER JOIN Books b
ON b.ISBN = t.ISBN
为了帮助提高性能,我建议您在Books
表中插入后创建以下两个索引:
CREATE NONCLUSTERED INDEX IXN_Books_ISBN ON Books(ISBN)
CREATE NONCLUSTERED INDEX IXN_OldUglyTable_ISBN ON OldUglyTable(ISBN) INCLUDE(AuthorName)
PS:我想我可以根据本文将我的测试结果和查询吐出到文本文件中,以避免System.OutOfMemoryException错误。我真正的问题只是获得正确的查询来移动数据并创建FK关系。你能发布你的查询吗?