我有多个由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)位于内部查询而不是表中
答案 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