选择子查询的查询结果集是否在T-Sql中插入静态选择..?

时间:2016-07-12 16:24:03

标签: sql-server tsql

source_tbl:   email_addr,角色

target_tbl:   email_addr,角色

source_tbl可以有很多电子邮件地址。 target_tbl可以有一个不同的电子邮件地址(source_tbl中的角色合并到target_tbl中的角色 - 只是fyi)

我担心的是没有在target_tbl中复制电子邮件地址(dba设置没有约束)

我怀疑Insert into Select中的子查询是否完成一次,然后插入使用该结果集。如果是这种情况,那么像这样的查询将无法工作:

insert into target_tbl 
 ( email_addr, roles)
select 
 src.email_addr,
 src.role
from source_tbl src
where src.email_address not in ( select email_addr from target_tbl)

找不到任何可以证实我怀疑的内容,查看是否有人可以指出我提供此确认的文档

1 个答案:

答案 0 :(得分:1)

您是否在询问是否为每一行重新评估以下子查询,因此考虑了之前由同一语句添加的电子邮件地址?

 where src.email_address not in ( select email_addr from target_tbl)

如果是这样,答案是"没有"。

它将在开始时进行评估,并在Halloween Protection的某个地方进行假脱机(除非SQL Server设法提出一个计划,保证这些语义没有假脱机,但答案仍然相同)。< / p>

因此,如果SELECT查询返回abc@dfg.com的3行,并且该目标表中已存在该电子邮件地址,则将插入所有三行。

您可以将SELECT更改为仅为每封电子邮件选择一行,或者在ignore_dup_key打开的情况下向表中添加唯一约束,以保留遇到的第一个(任意)一个。可能第一个选项更有用,因为它可以控制保留哪一个。