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

实现带条件的Left outer join 关联台账与部门参考表匹配BMDIV

SQL实现方案

实现思路

需求核心是匹配规则带优先级:优先匹配LCTRYNUM、LC、DEPTNUM三个字段完全相等的业务部门参考表记录,无匹配时再匹配参考表LC为'**'的LCTRYNUM、DEPTNUM两字段关联记录。

方案1:双左连接实现(推荐,逻辑简单性能好)

SELECT 
    l.LCTRYNUM,
    l.LC,
    l.DEPTNUM,
    l.Amount,
    -- 优先取精确匹配的BMDIV,无匹配取通配规则的BMDIV
    COALESCE(d1.BMDIV, d2.BMDIV) AS BMDIV
FROM ledger l
-- 第一次关联:精确匹配三个字段
LEFT JOIN dept_ref d1 
    ON l.LCTRYNUM = d1.LCTRYNUM 
    AND l.LC = d1.LC 
    AND l.DEPTNUM = d1.DEPTNUM
-- 第二次关联:匹配LC为通配符**的两字段规则
LEFT JOIN dept_ref d2 
    ON l.LCTRYNUM = d2.LCTRYNUM 
    AND l.DEPTNUM = d2.DEPTNUM 
    AND d2.LC = '**'

说明:上述SQL中ledger为台账实际表表名,dept_ref为业务部门参考表表名,可根据实际表名替换。

方案2:单关联加窗口函数实现(适合复杂多优先级场景)

WITH matched_data AS (
    SELECT 
        l.LCTRYNUM,
        l.LC,
        l.DEPTNUM,
        l.Amount,
        d.BMDIV,
        -- 优先级排序:精确匹配排序在前,通配匹配在后
        ROW_NUMBER() OVER (
            PARTITION BY l.LCTRYNUM, l.LC, l.DEPTNUM, l.Amount 
            ORDER BY CASE WHEN d.LC = '**' THEN 2 ELSE 1 END
        ) AS rn
    FROM ledger l
    LEFT JOIN dept_ref d
        ON l.LCTRYNUM = d.LCTRYNUM
        AND l.DEPTNUM = d.DEPTNUM
        AND (d.LC = l.LC OR d.LC = '**')
)
SELECT LCTRYNUM, LC, DEPTNUM, Amount, BMDIV
FROM matched_data
WHERE rn = 1

两种方案均可输出你提供的预期结果。

内容的提问来源于stack exchange,提问作者matus sumilas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 09:42:04