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)
อย่างที่คุณเห็นฉันกำลังทำแบบสอบถามย่อยเดิมซ้ำเพื่อให้คอลัมน์อื่นออกมา ฉันสงสัยว่าจะมีวิธีที่ดีกว่าในการทำเช่นนี้?
idเป็นคีย์หลักในทั้งสองตาราง ฉันไม่มีปัญหาในการสร้างproduct_special.priority ที่ไม่ซ้ำหากสามารถช่วยได้
cross apply
คือมีอยู่ใน Postgres เริ่มต้นด้วย 9.3 (ปล่อยตัวในปี 2013) แต่พวกเขาเลือกที่จะเป็นไปตามมาตรฐาน SQL และใช้มาตรฐานlateral
ผู้ประกอบการ ในข้อความค้นหาที่สองของคุณแทนที่left join
ด้วยleft join lateral