【问题标题】:Insert into table from another table where the records don't exist从不存在记录的另一个表中插入表
【发布时间】:2017-05-24 14:27:57
【问题描述】:

我试图弄清楚如何从现有表 (tbl01) 中不存在记录的临时表 (temp) 中插入现有表 (tbl01)。我希望这是有道理的。我基本上是在尝试使用自上次更新表以来发生的记录来更新表。到目前为止,这是我的代码:

insert into tbl01
(sale_store, sale_dt, sale_register, sale_trans)
select distinct
sale_store, sale_dt, sale_register, sale_trans
from temp
where NOT EXISTS (select * from tbl01)

我遇到的问题是它运行,但没有将任何新记录放入表中 - 应该有很多新记录。我敢肯定这是我想念的小而愚蠢的东西。我以这篇文章为指导:How to avoid duplicates in INSERT INTO SELECT query in SQL Server?

提前谢谢你!

【问题讨论】:

  • 如何确定tbl01 中的不同记录。是sales_store,还是多个字段? NOT EXISTS (SELECT ...) 运行 select 语句,如果它有任何记录,则 NOT EXISTS 失败,因此您需要相关子查询,或者使用' NOT IN (SELECT FROM...)`跨度>
  • 这四个字段共同创建了一个“不同的”记录。因此,我需要将所有这四个字段都包括在内,例如: where not exists (select sale_store, sale_dt, sale_register, sale_trans from tbl01
  • 如果您的目标是作为 SET 表创建的,并且您的 PK 包含所有列,您可以简单地 INSERT/SELECT 而没有 WHERE,重复的行将被 SET 表静默丢弃。

标签: sql insert teradata sql-insert insert-into


【解决方案1】:

问题是您的内部查询不以任何方式依赖临时表。基本上,您写的是“如果tbl01 中不存在记录,则插入tbl01”。要修复它,您需要在 exists 内的查询中添加 where 子句:

insert into tbl01
(sale_store, sale_dt, sale_register, sale_trans)
select distinct
sale_store, sale_dt, sale_register, sale_trans
from temp
where NOT EXISTS (
    select * 
    from tbl01
    where temp.sale_store = tbl01.sale_store 
    and temp.sale_dt = tbl01.sale_dt
    and temp.sale_register = tbl01.sale_register
    and temp.sale_trans = tbl01.sale_trans)

【讨论】:

  • 根据问题中的 cmets,主键是所有 4 个字段。
  • 谢谢你,佐哈尔!这对于确保密钥不存在是有意义的。完美!
猜你喜欢
  • 2017-08-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-23
  • 2016-01-17
  • 1970-01-01
  • 2010-09-09
  • 1970-01-01
  • 2010-09-26
相关资源
最近更新 更多