SQL查询优化:删除内部选择

时间:2013-06-25 23:39:58

标签: sql oracle query-optimization

有人知道如何在没有内部选择的情况下将此查询更改为查询吗?

SELECT COUNT(*)
FROM products p
WHERE prod_list_price < 1.15 * (SELECT avg(unit_cost)
  FROM costs c
  WHERE c.prod_id = p.prod_id);

上面的一个返回符合条件的所有产品的计数,我试图自己更改它,但它不会返回相同的内容:

SELECT COUNT(*)
FROM (PRODUCTS p inner join COSTS c
on p.prod_id = c.prod_id)
group by p.prod_list_price
HAVING AVG(c.unit_cost) * 1.15 > p.prod_list_price;

它不会让我按照p.prod_id分组我真正想要的东西。
由于有......所以它需要小组。

2 个答案:

答案 0 :(得分:1)

“innerselect”有什么问题?

无论如何,可以假设p.prod_idproducts中的关键字,在这种情况下,这也应该有用:

SELECT COUNT(*)
FROM (
  SELECT p.prod_id,  p.prod_list_price, avg(c.unit_cost) avg_cost
  FROM products p inner join costs c
   ON c.prod_id = p.prod_id
  GROUP BY p.prod_id, p.prod_list_price
) 
WHERE prod_list_price < 1.15 * avg_cost

答案 1 :(得分:0)

我建议使用join和聚合:

进行此操作
SELECT COUNT(*)
FROM products p join
     (select c.prod_id, avg(unit_cost) as avgcost
      from costs c
      group by c.prod_id
     ) c
     on c.prod_id = p.prod_id
WHERE p.prod_list_price < 1.15 * c.avgcost

Oracle虽然有一个相当不错的优化器,所以我不确定它是否会带来更高效的执行计划。您必须查看该计划才能看到。