Как избавиться от коррелирующего подзапроса?

Доброго времени суток! Подскажите, пожалуйста, есть ли возможность избавиться в блоке WHEREот подзапроса, очень много времени занимает выборка
SELECT "c"."product_id" AS "id", "c"."price_fallback" AS "price", "c"."price_base" AS "price_old"
FROM "product" "p" INNER JOIN "cache" "c" ON p.id = c.product_id INNER JOIN "vendor"  ON p.vendor_id = vendor.id 
WHERE ("c"."showcase_id" IN (66, 1))
 AND (c.price_fallback = (select min(price_fallback) from "cache" where c.product_id=product_id))
 ORDER BY "p"."id" LIMIT 50


заранее спсаибо!
  • Вопрос задан
  • 176 просмотров
Пригласить эксперта
Ответы на вопрос 2
Alex_Geer
@Alex_Geer
System Engineer
SELECT "id", "price_fallback" AS "price", "price_base" AS "price_old"
FROM (
  SELECT 
    "c"."product_id" AS "id",
    "c"."price_fallback",
    "c"."price_base",
    ROW_NUMBER() OVER(PARTITION BY "c"."product_id" ORDER BY "c"."price_fallback") AS rn
  FROM "product" "p" 
  INNER JOIN "cache" "c" ON p.id = c.product_id 
  INNER JOIN "vendor" ON p.vendor_id = vendor.id 
  WHERE ("c"."showcase_id" IN (66, 1))
)
WHERE rn = 1
ORDER BY "id"
LIMIT 50;
Ответ написан
Комментировать
iMedved2009
@iMedved2009
Не люблю людей
А так сработает?
select
       "product_id" AS "id",
       min("price_fallback") AS "price",
       (array_agg("price_base" ORDER BY price_fallback DESC))[1] as "price_old" 
from "cache" 
WHERE ("showcase_id" IN (66, 1))
group by "product_id"
order by "product_id"
limit 50;
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы