【问题标题】:insert into fails to insert selected datainsert into 无法插入所选数据
【发布时间】:2017-12-19 20:05:22
【问题描述】:

在过去的几周里,我一直在努力将 68GB 的​​表分解成更规范的结构,直到今天一切都进展顺利。

我正在尝试使用此查询将大表中的选定几列移动到新表中:

insert into [destination] (col1, col2, col3...)
select col1, col2, col3
From [source]
where companyID = [source].companyID

我收到了消息,(60113678 行受影响),但数据没有插入到目标,源表中的数据也没有改变,所以什么受到影响,为什么没有是否有任何数据插入到目标中?

【问题讨论】:

  • but the data was not inserted into the destination
  • where companyID = [source].companyID您正在尝试加入表格?
  • 您的 WHERE 子句根本没有任何作用。作用域仅限于SELECT,所以看不到[destination]表,也就是说只能看到[source]表。因此,不合格的companyID 被引用到[source]。这给了WHERE [source].companyID = [source].companyID,我怀疑你想这样做吗?请你解释一下它应该做什么?另外,您如何验证没有插入任何行?请显示完整的脚本和结果;类似SELECT COUNT(*) FROM [destination]; INSERT <blah>; SELECT COUNT(*) FROM [destination];
  • igor,目标表有两列数据和 8 个空值,所有空值仍然存在,受影响的行数是目标行数的三倍。
  • MatBailie 这就是我需要的解释。至于我想要完成的工作,我正在将特定的数据列从一个有超过 2000 万个重复项的表中移到一个新表中。

标签: sql sql-server insert-into


【解决方案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 中的 new 行中。

显然,这个故事的一个寓意是了解insertupdate 之间的区别。更重要的是,限定查询中的所有列名。如果您这样做了,您的查询将在 source.CompanyID = destination.CompanyId 处失败——您不必弄清楚如何删除 60,113,678 条新行。

【讨论】:

  • 非常感谢您的快速回复。我可以询问为什么更新而不是插入?
  • @Sluggish1 where companyID = [source].companyID 表示您需要UPDATE 而不是INSERT
  • @Sluggish1 。 . .因为您似乎想要更改现有行而不是插入新行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-10
相关资源
最近更新 更多