1

我有两个表 ACTUAL 和 ESTIMATE 具有唯一列(sal_id、gal_id、amount、tax)。

在 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 中,则填充估计记录(以及添加金额和税款)。

In FINAL table
id sal_id、gal_id、actual_id、estimate_id、total
1 111 222 1 null 101(因为实际表中存在 111 222 的记录)
2 110 223 2 null 202(因为实际表中存在 110 223 的记录)
3 123 250 null 4 51(因为实际表中不存在记录,但估计存在 123 250)

(估计为212 312组合,由于记录已经处理,无需再次处理)。

我正在使用 Oracle 11g。请帮助我在单个 sql 查询中编写逻辑?

谢谢。

4

1 回答 1

1

有几种方法可以编写此查询。一种方法是使用连接和合并:

select coalesce(a.sal_id, e.sal_id) as sal_id,
       coalesce(a.gal_id, e.gal_id) as gal_id,
       coalesce(a.actual_value, e.estimate_value) as actual_value
from actual a full outer join
     estimate e
     on a.sal_id = e.sal_id and
        a.gal_id = e.gal_id

这假定 sal_id/gal_id 提供表之间的唯一匹配。

由于您使用的是 Oracle,这可能是一种更清晰的方法:

select sal_id, gal_id, actual_value
from (select *,
             max(isactual) over (partition by sal_id, gal_id) as hasactual
      from ((select 1 as isactual, *
             from actual
            ) union all
            (select 0 as isactual, *
             from estimate
            )
           ) t
     ) t
where isactual = 1 or hasactual = 0

此查询使用窗口函数来确定是否存在与 sal_id/gal_id 匹配的实际记录。逻辑是取所有实际值,然后取所有与实际值不匹配的记录。

于 2012-07-28T14:34:23.200 回答