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

如何联结列数不同的两个SQL查询?附具体查询语句

嘿,我来帮你搞定这个跨查询联结的问题!当你需要把两个列数不同的SQL查询结果合并时,核心思路是把它们各自作为子查询,然后通过共同的字段(这里就是allowdeductname_en)做关联。下面给你几个实用的实现方法,你可以根据需求选择:

方法1:LEFT JOIN 保留所有去重的名称(最常用)

如果你想覆盖所有可能的allowdeductname_en(也就是Query2里的全量去重结果),同时关联Query1中对应名称的统计值GGG,没有统计数据的名称会显示NULL,用这个方法最合适:

SELECT 
    q2.allowdeductname_en,
    q1.GGG
FROM (
    -- Query2:获取所有去重的allowdeductname_en
    SELECT DISTINCT allowdeductname_en 
    FROM TPYDPROCMTDD  -- 补全你原Query2里的表名,这里假设是和Query1同表
) q2
LEFT JOIN (
    -- Query1:统计符合条件的总和
    SELECT 
        allowdeductname_en, 
        SUM(SFD_comp_value_tax@;emp_id) as GGG 
    FROM TPYDPROCMTDD md 
    LEFT JOIN TPYDPROCMTDH mh 
        ON md.procmtdh_id = mh.procmtdh_id 
        AND md.company_id = mh.company_id 
    WHERE md.allowdeducttype = 'A' 
        AND md.company_id = '13565' 
        AND mh.company_id = '13565' 
        AND YEAR(mh.paydate) = 2017 
        AND MONTH(mh.paydate) = 1 
        AND mh.costcenter_code = 99990001 
    GROUP BY allowdeductname_en 
    ORDER BY allowdeductname_en
) q1 ON q2.allowdeductname_en = q1.allowdeductname_en;
方法2:RIGHT JOIN 仅保留有统计数据的名称

如果你只关心Query1里有统计结果的名称,同时关联Query2的去重名称(不过Query1分组后的allowdeductname_en本身就是去重的,这个场景用得不多),可以用RIGHT JOIN:

SELECT 
    q2.allowdeductname_en,
    q1.GGG
FROM (
    -- Query1:统计符合条件的总和
    SELECT 
        allowdeductname_en, 
        SUM(SFD_comp_value_tax@;emp_id) as GGG 
    FROM TPYDPROCMTDD md 
    LEFT JOIN TPYDPROCMTDH mh 
        ON md.procmtdh_id = mh.procmtdh_id 
        AND md.company_id = mh.company_id 
    WHERE md.allowdeducttype = 'A' 
        AND md.company_id = '13565' 
        AND mh.company_id = '13565' 
        AND YEAR(mh.paydate) = 2017 
        AND MONTH(mh.paydate) = 1 
        AND mh.costcenter_code = 99990001 
    GROUP BY allowdeductname_en 
    ORDER BY allowdeductname_en
) q1
RIGHT JOIN (
    -- Query2:获取所有去重的allowdeductname_en
    SELECT DISTINCT allowdeductname_en 
    FROM TPYDPROCMTDD
) q2 ON q1.allowdeductname_en = q2.allowdeductname_en;
方法3:FULL OUTER JOIN 保留两边所有数据

如果Query1和Query2的allowdeductname_en可能存在互相没有的情况(比如Query2是其他表的去重名称),可以用FULL OUTER JOIN,两边的记录都会保留,缺失的字段自动填充NULL:

SELECT 
    COALESCE(q1.allowdeductname_en, q2.allowdeductname_en) as allowdeductname_en,
    q1.GGG
FROM (
    -- Query1:统计符合条件的总和
    SELECT 
        allowdeductname_en, 
        SUM(SFD_comp_value_tax@;emp_id) as GGG 
    FROM TPYDPROCMTDD md 
    LEFT JOIN TPYDPROCMTDH mh 
        ON md.procmtdh_id = mh.procmtdh_id 
        AND md.company_id = mh.company_id 
    WHERE md.allowdeducttype = 'A' 
        AND md.company_id = '13565' 
        AND mh.company_id = '13565' 
        AND YEAR(mh.paydate) = 2017 
        AND MONTH(mh.paydate) = 1 
        AND mh.costcenter_code = 99990001 
    GROUP BY allowdeductname_en 
    ORDER BY allowdeductname_en
) q1
FULL OUTER JOIN (
    -- Query2:获取所有去重的allowdeductname_en
    SELECT DISTINCT allowdeductname_en 
    FROM TPYDPROCMTDD
) q2 ON q1.allowdeductname_en = q2.allowdeductname_en;

另外提个小建议:你Query1里的SUM(SFD_comp_value_tax@;emp_id)字段名看起来有点奇怪,会不会是笔误?比如是不是SFD_comp_value_tax是字段名,@;emp_id是多余的?可以检查一下这个地方哦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:32:15