将两个几乎相同的UNIONed查询合并为一个

时间:2015-04-01 15:38:15

标签: sql oracle performance union

我有多个由UNION ALLs嵌套在一起的查询;一些内部查询几乎相同。

例如

select sum(x.amount) as amnt, 'txt1' as name, x.cfg as cfg from tbl1
union all
select -sum(x.amount) as amnt, 'txt2' as name, x.cfg as cfg from tbl1

结果:

AMNT|NAME|CFG
----+----+---
12  |txt1|  Z
-12 |tst2|  Z

由于内部查询不是很小并且自己去了很多表,我试图通过将这两个内部查询合并为一个来节省处理时间和资源。考虑到NAME(txt1 / txt2)位于内部查询而不是表中

1 个答案:

答案 0 :(得分:1)

对于此特定示例,您需要使用一些条件逻辑复制返回的结果。如果将条件逻辑放入CTE,然后对主表执行笛卡尔连接,则主表中的每一行都将按连接中的记录数复制。在这种情况下,这将是2。

with multiplier (m, name) as (
 select 1, 'txt1' from dual
  union all
 select -1, 'txt2' from dual
        )
select multiplier.m * sum(t.amount), multiplier.name, t.cfg
  from tbl1 t
 cross join multiplier