如何在Oracle 11g中使用Left Outer Join或Right Outer Join

时间:2013-05-24 15:26:41

标签: sql oracle11g

我在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');

2 个答案:

答案 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匹配,反之亦然。

我建议你将它分成两个单独的查询,将它们组合在一起,然后在顶部求和。