有人知道如何在没有内部选择的情况下将此查询更改为查询吗?
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分组我真正想要的东西。
由于有......所以它需要小组。
答案 0 :(得分:1)
“innerselect”有什么问题?
无论如何,可以假设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
答案 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虽然有一个相当不错的优化器,所以我不确定它是否会带来更高效的执行计划。您必须查看该计划才能看到。