SELECT
*,
p.name AS name,
p.image,
p.price,
(
SELECT ps.price
FROM product_special ps
WHERE p.id = ps.id
AND ps.date < NOW()
ORDER BY ps.priority ASC, LIMIT 1
) AS special_price,
(
SELECT ps.date
FROM product_special ps
WHERE p.id = ps.id
AND ps.date < NOW()
ORDER BY ps.priority ASC, LIMIT 1
) AS date
FROM product p LEFT JOIN product_special ps ON (p.id = ps.id)
Jak widać, powtarzam to samo podzapytanie, aby uzyskać kolejną kolumnę. Zastanawiam się, czy jest na to lepszy sposób?
id jest kluczem podstawowym w obu tabelach. Nie mam problemu z unikaniem product_special.priority, jeśli to może pomóc.
cross apply
jest dostępny w Postgres od wersji 9.3 (wydanej w 2013 r.), ale zdecydowali się przestrzegać standardu SQL i użyć standardowegolateral
operatora. W swoim drugim zapytaniu zastąpićleft join
zleft join lateral