以下是示例表:
产品价格(PRD)
订购产品 (ord)
期望的结果
我的第一次尝试是以下方法:
SELECT ord.order_date, ord.id, ord.product, prd.price
FROM tra
LEFT JOIN (
SELECT *
FROM prd
ORDER BY prd.start_date ASC
) AS prd ON ord.id = prd.id AND ord.order_date >= prd.start_date
但是有些记录不断重复,例如:
不想要的结果
我知道为什么它们是重复的,但不知道该怎么办。 知道如何修复该查询吗?
最佳答案
正如 Joel Coehoorn 指出的那样,查询的目的确实是横向连接。
Any idea how I could fix the query?
该技术是在子查询内移动谓词。
在 Postgres 中:
SELECT o.*, p.price, p.start_date
FROM ord o
LEFT JOIN LATERAL (
SELECT p.*
FROM prd p
WHERE p.id = o.id and p.start_date <= o.order_date
ORDER BY start_date DESC LIMIT 1
) p ON TRUE
横向连接的好处之一是它可以返回多行和多列。但如果您想要的只是价格,标量子查询也足够了。
关于SQL:如何限制第一个与条件匹配的连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76124858/