假设“数量”的列是“非空”列(选择另外一个检查null如果这不是这种情况:
(注:加入的“其中日期> =”内嵌视图从OP的后续请求)
from (
select distinct e.number as e_number, B.name, B.number, b.date, B.aud_date,
B.day, B.location
from tableB B left outer join
(select * from employee where date >= <blah>) e
on e.name=B.name and e.number = e.number
and e.date = B.date and e.day=B.day and e.location=B.location
where e.number is null
) j
insert overwrite into table employee e
select j.name, j.number, j.date, j.aud_date, j.day, j.location
要回答这个问题:“为什么是e.number是空的条件有”:左外连接,保证从第一个表中的所有值都包括在结果中,那么什么发生在第二个表中没有值的情况下:在这种情况下,第二个表中的所有列都会报告为null。
所以在上面,我们正在为第二个表项丢失的情况精确搜索的情况下 - 因而我们:
- 选择从表中的两永不空(又名NOT NULL)列之一。所以:是一个永远在场的专栏?如果不是,则请选择另一个
- 指定条件“table1-alias”。“table1-never-null-column”= null。这意味着该记录实际上不存在于连接条件中 - 因此我们发现只存在于表1中的记录。
感谢您的帮助......请允许我告诉我为什么您要检查e。数字是NULL? – user3072054
当然,我已经更新了答案,试图解释。 – javadba
非常感谢你的清晰解释..更重要的是,如果我将表员工按日期分区,我不想在LEFT OUTER JOIN期间扫描整个分区。相反,我想根据tableB中的日期只扫描特定的分区(员工表)。是否有可能??? ..我们有一个大的表'n'分区数..如果我扫描通过所有这将需要大量的时间和影响性能.. – user3072054