2013-06-25 2 views
0

누군가가이 쿼리를 innerselect없이 쿼리로 변경하는 방법을 알고 있습니까?SQL 쿼리 최적화 : 내부 선택 제거

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에 의해 실제로 내가 원하는 것.
그리고 그것은 때문에 갖는하여 그룹을 필요로 ...

답변

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 
+0

prod_list_price ... – Teysz

+0

죄송합니다, 너무 많은 맥주를 인식하지 못합니다 ... 문제를 해결했습니다. – mustaccio

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 

오라클은 그래도 꽤 좋은 최적화를 가지고, 그래서 아니에요 보다 효율적인 실행 계획이 생길 것입니다. 보시려면 계획을 봐야 할 것입니다.

+0

그것은 작동하지만, 조금 느리다. 그러나 당신의 대답에 감사드립니다. 추신 실행 계획은 어디에서 찾을 수 있습니까? – Teysz

+0

신경 쓰지 마십시오. 나는 잘못된 것을보고 있었고 실행 계획을 찾았습니다. – Teysz