You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 05:48:22