我有ORACLE UNION SQL工作正常。 能否请你帮我找到重写SQL的替代品:Oracle:如何为性能重写UNION
SELECT *
FROM (
select app_id, org_id, emp_id, name, name_id,
from TableA AAA, TableC CCC, TableB BBB
where BBB.ID=CCC.ID
AND AAA.ID=BBB.ID
UNION
select app_id, org_id, emp_id, name, name_id,
from TableA AAA, TableC CCC,TableD DDD
where DDD.ID=CCC.ID
AND AAA.ID=DDD.ID
) MYTABLE
WHERE MYTABLE.app_id = '1234'
AND MYTABLE.org_id = '5678';
我试图UNION SQL转换成标量查询的一些建议,但我得到的错误:“值过多”
SELECT
(select app_id, org_id, emp_id, name, name_id,
from TableA AAA, TableC CCC, TableB BBB
where BBB.ID=CCC.ID
and AAA.ID=BBB.ID
and app_id = '1234'
and org_id = '5678'
) q1,
(select app_id, org_id, emp_id, name, name_id,
from TableA AAA, TableC CCC,TableD DDD
where DDD.ID=CCC.ID
and AAA.ID=DDD.ID
and app_id = '1234'
and org_id = '5678'
) q2
) from dual;
我的Scalar查询中可能存在什么问题? 或者还有其他方法可以用更好的性能重写此查询吗? 非常感谢。
您不能在一列中使用子查询中的多个值,就像你选择的那样。你是否尝试过在单一选择中对表格D&B进行外连接? – Bob
你能揭露app_id和org_id来自哪个表吗?如果他们来自AAA和CCC,那么您可以在加入BBB和DDD之前将其限制在子查询中。联盟是昂贵的,因为它必须过滤出不同的值(而不是联盟所有,这不关心)。如果您可以限制必须进行分组/排序的记录数量,它将对逻辑IO数量产生巨大影响。 – Hambone
如果两个查询都不返回重复项以过滤掉,则可以使用'union all'。 'union all'会保持原样不变,而'union'基本上可以得到结果的所有'distinct'值,这显然是一个额外的处理步骤。 – GolezTrol