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)
找不到任何可以证实我怀疑的内容,查看是否有人可以指出我提供此确认的文档
答案 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
打开的情况下向表中添加唯一约束,以保留遇到的第一个(任意)一个。可能第一个选项更有用,因为它可以控制保留哪一个。