0

我有一个在 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');
4

2 回答 2

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子句中。

于 2013-05-24T15:35:12.650 回答
0

您确定此查询正在返回所需的数据吗?在我看来,它将为每个 op、pl、p 匹配返回 op、ssl 和 ss 的笛卡尔积,反之亦然。

我建议您将其拆分为两个单独的查询,将它们合并在一起,然后在顶部求和。

于 2013-05-24T15:37:20.280 回答