SQL:如何限制第一个与条件匹配的连接?

标签 sql postgresql subquery lateral-join

以下是示例表:

产品价格(PRD)

<表类=“s-表”> <标题> 开始日期 产品 价格 <正文> 2023-04-01 产​​品_A 10.0 2023-04-15 产​​品_A 20.0 2023-04-01 产​​品_B 20.0

订购产品 (ord)

<表类=“s-表”> <标题> 订单日期 id 产品 <正文> 2023-04-01 10001 产​​品_A 2023-04-01 10001 产​​品_B 2023-04-02 10002 产​​品_A 2023-04-02 10002 产​​品_B 2023-04-16 10003 产​​品_A 2023-04-16 10003 产​​品_B

期望的结果

<表类=“s-表”> <标题> 订单日期 id 产品 价格 <正文> 2023-04-01 10001 产​​品_A 10.0 2023-04-01 10001 产​​品_B 20.0 2023-04-02 10002 产​​品_A 10.0 2023-04-02 10002 产​​品_B 20.0 2023-04-16 10003 产​​品_A 20.0 2023-04-16 10003 产​​品_B 20.0

我的第一次尝试是以下方法:

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

但是有些记录不断重复,例如:

不想要的结果

<表类=“s-表”> <标题> 订单日期 id 产品 价格 <正文> 2023-04-16 10003 产​​品_A 10.0 2023-04-16 10003 产​​品_B 20.0

我知道为什么它们是重复的,但不知道该怎么办。 知道如何修复该查询吗?

最佳答案

正如 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/

相关文章:

sql - SELECT UNION 和 ORDER BY 在 mysql.. 怎么办?

sql - 递归 CTE 如何使用它

java - 双参数PreparedStatement 抛出语法错误,SQL 状态 42601,靠近第二个参数

sql - 我们可以在 plpgsql 函数的 begin-end block 中声明变量吗?

php - 如何使用 mysqli 进行 LIKE 查询并获取所有结果?

sql - 从现有表中填充多对多表

mysql - SQL - 每人随机选择一条记录

php - Laravel:如何在 Laravel 查询构建器中使用派生表/子查询

mysql排序: will it work consistantly?解决方案

.net - 在选择部分中使用子选择的 Linq to Entities