0

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

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 分组。
它需要 group by 因为有...

4

2 回答 2

1

“内部选择”有什么问题?

无论如何,可以假设这p.prod_id是一个关键products,在这种情况下,这也应该工作:

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
于 2013-06-26T00:21:51.573 回答
0

我建议使用 ajoin和聚合来执行此操作:

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 有一个非常好的优化器,所以我不确定它是否会产生更有效的执行计划。您必须查看计划才能看到。

于 2013-06-25T23:48:59.967 回答