我有两个表ACTUAL和ESTIMATE具有唯一列(sal_id,gal_id,金额,税)。
在ACTUAL表中我有
actual_id, sal_id, gal_id, process_flag, amount, tax
1 111 222 N 100 1
2 110 223 N 200 2
在ESTIMATE表中我有
estimate_id, sal_id, gal_id, process_flag, amount, tax
3 111 222 N 50 1
4 123 250 N 150 2
5 212 312 Y 10 1
现在我想要一个最终表,它应该有来自ACTUAL表的记录,如果在ACTUAL中没有sal_id + gal_id映射的记录但存在于ESTIMATE中,则填充估计记录(以及添加金额和税金)。
在FINAL表中
id sal_id, gal_id, actual_id, estimate_id, total
1 111 222 1 null 101 (since record exist in actual table for 111 222)
2 110 223 2 null 202 (since record exist in actual table for 110 223)
3 123 250 null 4 51 (since record not exist in actual table but estimate exist for 123 250)
(估计为212 312组合,因为记录已经处理,无需再次处理)。
我正在使用Oracle 11g。请帮我在单个SQL查询中编写逻辑?
答案 0 :(得分:2)
select sal_id,gal_id,actual_id,null estimate_id,amount,tax from actual where process_flag='N'
union all
select sal_id,gal_id,null actual_id,estimate_id,amount,tax from estimate where process_flag='N' and
(sal_id,gal_id) not in (select sal_id,gal_id from actual where process_flag='N')
答案 1 :(得分:0)
这是一种方法,通过从“实际”中获取所有内容,然后仅使用“实际”中的内容中的内容:
select a.*
from Actual a
union all
select e.*
from Estimate e
where not exists (select 1 from actual a where a.sal_id = e.sal_id and a.gal_id = e.gal_id) and
e.process_flag = 'N'
如果您拥有大量数据,这可能不是最有效的方法。但它应该可以在较小的数据集上正常工作。