过去几周,我一直在努力将一块68GB的桌子拆分成一个更加标准化的结构,一切都顺利进行到今天。
我正在尝试使用此查询将大表中的精选几列移动到新表中:
insert into [destination] (col1, col2, col3...)
select col1, col2, col3
From [source]
where companyID = [source].companyID
我收到消息,(60113678行受影响),但数据没有插入目的地,源表中的数据也没有被更改,所以受影响的是什么,为什么没有插入目的地的任何数据?
答案 0 :(得分:1)
您似乎想要执行的代码是:
update d
set col1 = s.col1,
col2 = s.col2,
col3 = s.col3
from destination d join
sources s
on s.companyID = s.companyId;
您编写的代码相当于:
insert into [destination] (col1, col2, col3...)
select s.col1, s.col2, s.col3
From [source]
where s.companyID = s.companyID;
where
相当于s.companyID is not null
。因此,您已将source
中的所有60,113,678行插入destination
中的新行。
显然,故事的一个道德是理解insert
和update
之间的区别。更重要的是,限定查询中的所有列名称。如果您这样做了,那么您的查询将在source.CompanyID = destination.CompanyId
失败 - 您无需弄清楚如何删除60,113,678个新行。