SQL三表关联查询:筛选正金额匹配对应订单日期实现方法
实现方案
原有内连接写法的问题在于会拉取所有关联订单,既无法过滤负金额无效记录,也无法按产品维度只保留1条符合要求的记录,同时内连接会丢失无有效订单的产品数据。
核心逻辑
- 提前过滤
Order List表中金额小于等于0的无效记录,从根源上排除负金额订单被选中的可能 - 使用窗口函数
ROW_NUMBER()给每个产品下的有效订单按规则排序编号,取排序后序号为1的记录即为每个产品的第一条符合要求的订单 - 用左连接关联产品表,保证无有效订单的产品也能返回,对应日期、金额字段返回NULL
可直接运行的SQL代码
WITH valid_orders AS ( SELECT ol.ProductID, ol.Amount, o.Date, ROW_NUMBER() OVER ( PARTITION BY ol.ProductID ORDER BY o.Date ASC -- 匹配示例逻辑:按日期从早到晚排序取第一条,可按需调整排序规则 ) AS row_num FROM `Order List` ol INNER JOIN `Order` o ON ol.OrderID = o.OrderID WHERE ol.Amount > 0 ) SELECT p.ID AS `Product ID`, vo.Date, vo.Amount FROM Products p LEFT JOIN valid_orders vo ON p.ID = vo.ProductID AND vo.row_num = 1;
返回结果校验
执行后返回结果完全匹配预期:
| Product ID | Date | Amount |
|---|---|---|
| ID1 | 10.01.21 | 3 |
| ID2 | 15.04.22 | 2 |
| ID3 | NULL | NULL |
注意:表名
Order List、Order包含空格或属于SQL保留字,编写时需要根据你使用的数据库类型加对应的转义符(比如MySQL用反引号,SQL Server用方括号)。
内容的提问来源于stack exchange,提问作者Michael Müller
相关产品推荐
相关产品推荐

