两表关联,取B表满足条件的第一条数据

在SQL查询中,当需要从两个表关联中获取满足特定条件的第一个匹配项时,可以使用LEFT JOIN结合子查询来实现。例如,在商品和价格表中,要获取每个商品的最新有效价格(生效日期在商品上市之前),可以使用LEFT JOIN配合子查询,确保只选择满足条件的最早记录。此外,还提到了一种简化写法,但该方法依赖于价格表中数据插入顺序与生效时间顺序一致,因此适用场景有限。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

例如有两个表goods和prices,商品表中的一条商品信息会对应价格表中的多条价格信息,现在要根据商品表查询其商品对应的可用最新的价格,即要满足价格的生效日期必须在商品上市之前,如果有多个价格,就选取最后生效的那个价格。

goods:商品表

序号商品名称上市日期
1iphone62015-10-01
2iphone62016-08-01
3iphone62017-09-01

prices:价格表

序号商品名称单价生效日期
6iphone665002015-09-15
7iphone660002016-06-15
8iphone658002017-08-15

希望得到的结果是:

货物序号商品名称上市日期单价单价生效日期
1iphone62015-10-0165002015-09-15
2iphone62016-08-0160002016-06-15
3iphone62017-09-0158002017-08-15
常见问题:只是通过left join进行外联查询,例如我现在要查询“上市日期”= 2017-09-01,“商品名称”=“iphone6”的商品对应的单价如果仅仅使用select B.price from goods A left join prices B on A.goods_name = B.goods_name and A.launch_date > B.effective_date,这样查出来会有三个价格符合条件,现在要选择最新的一个价格,还需要在初步筛选的结果中选取生效日期最大的数据,最后查询sql如下:

select A.*,B.price,B.effective_date from goods A left join prices B 
        on A.goods_name = B.goods_name and A.launch_date > B.effective_date

        and B.effective_date = (

        select max(effective_date) from prices where A.goods_name = goods_name and A.launch_date > effective_date)

order by A.id

红色部分语句是用来筛选B表中满足条件的第一条数据,相当于把left join后的联查条件做了二次查询,这个条件如果漏掉,会导致查询结果为一对多。


(2) 当然还有一种不太严谨的写法,必要前提是prices表格中,数据 插入顺序(或者说主键顺序)与生效时间顺序是一致的,那么上面那个sql就可以简写为:

select A.*,B.price,B.effective_date from goods A left join prices B 
        on B.id = (select max(id) from prices where A.goods_name = goods_name and A.launch_date > effective_date)

order by A.id

这种写法使用场景有限,需要慎用。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值