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

SQL查询四级编码匹配行时如何将多列结果转为独立行并优化

解决方案

方案1:直接编写高效匹配查询(推荐,性能远优于多次OUTER APPLY)

直接通过单表查询完成规则匹配,一次返回所需独立行结果,无需额外转置处理:

WITH target_row AS (
    -- 先获取你要查询的目标行的各级编码
    SELECT 
        g1code t1, 
        g2code t2, 
        g3code t3, 
        g4code t4 
    FROM tmp_tbl 
    WHERE gcode_id = 4 -- 可替换为你的查询条件,比如WHERE g4code = 'NLZWO'
)
SELECT t.*
FROM tmp_tbl t, target_row
WHERE 
    t.g1code = target_row.t1 -- 最上级编码必须匹配
    AND (t.g2code IS NULL OR t.g2code = target_row.t2) -- 当前行g2非空则必须匹配目标g2
    AND (t.g3code IS NULL OR t.g3code = target_row.t3) -- 当前行g3非空则必须匹配目标g3
    AND (t.g4code IS NULL OR t.g4code = target_row.t4) -- 当前行g4非空则必须匹配目标g4
-- 按层级从高到低排序,直接得到8、7、4的顺序
ORDER BY 
    CASE 
        WHEN t.g3code IS NULL THEN 1 -- 只有前两级有值,对应id=8
        WHEN t.g4code IS NULL THEN 2 -- 前三级有值,对应id=7
        ELSE 3 -- 四级都有值,对应id=4
    END

方案2:已有平铺多列结果转独立行

如果你已经通过多次OUTER APPLY得到了单行平铺的结果,可以用CROSS APPLY + VALUES完成行转列,过滤无效NULL行:

SELECT 
    v.gcode_id,
    v.g1code,
    v.g2code,
    v.g3code,
    v.g4code
FROM 你的现有平铺结果集
CROSS APPLY (
    VALUES 
        -- 按你平铺后的字段名,依次填入四组匹配行的字段
        (id1, g1_1, g2_1, g3_1, g4_1),
        (id2, g1_2, g2_2, g3_2, g4_2),
        (id3, g1_3, g2_3, g3_3, g4_3),
        (id4, g1_4, g2_4, g3_4, g4_4)
) v(gcode_id, g1code, g2code, g3code, g4code)
-- 过滤无匹配的NULL行
WHERE v.gcode_id IS NOT NULL

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.18 23:06:02