我在where子句中使用“=”进行查询,但是当很多数据执行时很长时间。如何使用左外连接或右外连接或类似的东西来提高性能 这是查询:
select sum(op.quantity * op.unit_amount) into paid_money
from tableA op , tableB ssl, tableC ss, tableD pl, tableE p
where (op.id = ssl.id and ssL.id = ss.id and ss.type='A')
or
(op.id = pl.id and pl.id = p.id and p.type='B');
答案 0 :(得分:2)
你的问题不是左或右连接。它是交叉连接。你正在做许多不必要的笛卡尔产品。我猜这个查询永远不会完成。如果确实如此,那你无论如何都会得到错误的答案。
将其拆分为两个单独的连接,然后将结果合并在一起。仅使用每组连接所需的表:
select SUM(val) into paid_money
from (select sum(op.quantity * op.unit_amount) as val
from tableA op , tableB ssl
where (op.id = ssl.id and ssL.id = ss.id and ss.type='A')
union all
select sum(op.quantity * op.unit_amount) as val
from tableA op , tableD pl, tableD p
where (op.id = pl.id and pl.id = p.id and p.type='B')
) t
我没有修复你的连接语法。但是,您应该学习使用join
关键字并将连接条件放在on
子句而不是where
子句中。
答案 1 :(得分:0)
您确定此查询是否返回了所需的数据?对我而言,它似乎将返回op,ssl和amp;的笛卡尔积。 ss为每个op,pl,p匹配,反之亦然。
我建议你将它分成两个单独的查询,将它们组合在一起,然后在顶部求和。