oracle 11g sql查询从两个表连接中获取数据

时间:2012-08-28 18:02:16

标签: sql database join oracle11g

我有两个表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查询中编写逻辑?

2 个答案:

答案 0 :(得分:2)

这是SQLFiddle example

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'

如果您拥有大量数据,这可能不是最有效的方法。但它应该可以在较小的数据集上正常工作。