【问题标题】:oracle sql query to get data from two tables of similar typeoracle sql查询从两个相似类型的表中获取数据
【发布时间】:2012-07-26 23:01:35
【问题描述】:

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

在 ACTUAL 表中,我有 actual_id、sal_id、gal_id、process_flag、金额、税金
1 111 222 N 100 1
2 110 223 N 200 2

在 ESTIMATE 表中我有 估计id、sal_id、gal_id、process_flag、金额、税
3 111 222 N 50 1
4 123 250 N 150 2 5 212 312 是 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(因为实际表中存在 111 222 的记录)
2 110 223 2 null 202(因为实际表中存在 110 223 的记录)
3 123 250 null 4 51(因为实际表中不存在记录,但估计存在 123 250)

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

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

谢谢。

【问题讨论】:

  • 表之间是什么关系?
  • sal_id, gal_id 对两个表都是通用的。我需要根据 ACTUAL / ESTIMATE 表处理记录。

标签: sql database oracle join


【解决方案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 匹配的实际记录。逻辑是取所有实际值,然后取所有与实际值不匹配的记录。

【讨论】:

  • 谢谢戈登。我修改了我的问题,因为需要在 FINAL 表中填充actual_id/estimate_id。
  • 任何一个版本都可以工作。我更喜欢第二个版本。
猜你喜欢
  • 2012-02-24
  • 2012-08-23
  • 1970-01-01
  • 2013-07-15
  • 2015-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多