Oracle SQL:条件不满足时的表连接实现问题
解决SQL匹配价格并保留无匹配记录的问题
核心是用**LEFT JOIN(左外连接)**替代你之前用的普通INNER JOIN,这样能保留Table_1(t1)的所有记录,当Table_2(t2)没有符合条件的价格时,Price字段会自动返回NULL。
基础实现代码
SELECT t1.*, t2.Price FROM Table_1 t1 LEFT JOIN Table_2 t2 ON t1.Product_NR = t2.Product_NR AND t1.Quantity = t2.Quantity AND t1.Order_YYYYMM BETWEEN t2.Price_Active_Date_From AND t2.Price_Active_Date_To;
关键注意点
- 所有关联条件必须写在
ON子句里,不能放到WHERE子句中。如果把时间范围等条件放到WHERE里,会自动过滤掉t2匹配为空的行,效果就和INNER JOIN一样了。 - LEFT JOIN的逻辑是:保留左表(t1)的每一行,右表(t2)能匹配上就返回对应Price,匹配不上就返回NULL。
处理多匹配场景(可选)
如果t2中同一个Product_NR+Quantity存在多个重叠的价格有效期,上面的查询会返回多条重复的t1记录(对应每个匹配的t2行)。这种情况可以用窗口函数筛选唯一有效的价格,比如取最新生效的价格:
WITH RankedPrices AS ( SELECT *, -- 按产品+数量分组,按生效日期倒序排名,最新生效的排第1 ROW_NUMBER() OVER (PARTITION BY Product_NR, Quantity ORDER BY Price_Active_Date_From DESC) AS rn FROM Table_2 ) SELECT t1.*, rp.Price FROM Table_1 t1 LEFT JOIN RankedPrices rp ON t1.Product_NR = rp.Product_NR AND t1.Quantity = rp.Quantity AND t1.Order_YYYYMM BETWEEN rp.Price_Active_Date_From AND rp.Price_Active_Date_To AND rp.rn = 1;
内容的提问来源于stack exchange,提问作者Es-Dot
相关产品推荐
相关产品推荐

