2013-06-25 44 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_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 
+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 

Oracle有一個相當不錯的優化,雖然,所以我不確保它會產生更有效的執行計劃。你將不得不看看這個計劃才能看到。

+0

它的工作原理,但它是一個有點慢。但是,謝謝你的回答。附:我在哪裏可以找到執行計劃? – Teysz

+0

沒關係。我看到錯誤的東西,我找到了執行計劃。 – Teysz