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)
Như bạn có thể thấy tôi đang lặp lại cùng một truy vấn con chỉ để lấy một cột khác ra. Tôi tự hỏi có cách nào tốt hơn để làm điều này?
id là khóa chính trong cả hai bảng. Tôi không gặp vấn đề gì khi làm cho sản phẩm_special.p Warriority trở nên độc đáo nếu điều đó có thể giúp ích.
cross apply
là có sẵn trong Postgres bắt đầu với 9,3 (phát hành năm 2013) nhưng họ đã chọn để tuân thủ các tiêu chuẩn SQL và sử dụng các tiêu chuẩnlateral
vận hành. Trong truy vấn thứ hai của bạn thay thếleft join
bằngleft join lateral