0

このクエリをinnerselectなしのクエリに変更する方法を誰かが知っていますか?

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 でグループ化することはできません。
そして、持っているため、グループ化が必要です...

4

2 に答える 2

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 にはかなり優れたオプティマイザがあるため、より効率的な実行計画が得られるかどうかはわかりません。確認するには、計画を確認する必要があります。

于 2013-06-25T23:48:59.967 に答える