【发布时间】:2014-09-01 14:16:36
【问题描述】:
我有运行良好的 ORACLE UNION SQL。 你能帮我找到重写 SQL 的替代方法吗:
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;
我的标量查询可能有什么问题? 还是有其他方法可以以更好的性能重写此查询? 非常感谢。
【问题讨论】:
-
在这样的选择中使用子查询,列中不能有多个值。您是否尝试过在单次选择中对表 D 和 B 进行外连接?
-
你能公开 app_id 和 org_id 来自哪些表吗?如果它们来自 AAA 和 CCC,那么您可以在连接到 BBB 和 DDD 之前将它们限制在子查询中。联合很昂贵,因为它必须过滤掉不同的值(相对于联合所有,它不在乎)。如果可以限制必须分组/排序的记录数,将对逻辑 IO 的数量产生巨大影响。
-
如果两个查询都没有返回重复项以过滤掉,您可以使用
union all。union all将保留重复项不变,而union基本上得到了结果的所有distinct值,这显然是一个额外的处理步骤。
标签: php oracle stored-procedures plsql