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

SQL左连接查询如何保留无匹配记录的全量公司数据

问题根因

你的SQL无法返回全部公司,是因为LEFT JOIN时将右表VAC_PERIODOCIA的过滤条件写在了WHERE子句中。
左连接的特性是保留左表(COMPANIA)全部行,右表无匹配时右表字段返回NULL;但如果在WHERE中对右表字段做等值过滤,右表字段为NULL的行会因为不满足过滤条件被剔除,最终效果等价于内连接,自然无法返回没有关联记录的公司。

修正方案

两种写法都可以实现需求:

方案1:将右表过滤条件移到JOIN的ON子句

SELECT  
    COMPANIA.CIA_CLAVE, 
    COMPANIA.CIA_NOM, 
    CASE 
        WHEN VAC_PERIODOCIA.VAC_APLICA IS NULL THEN 'N' 
        ELSE 'Y'  
    END AS VAC_APLICA
FROM COMPANIA 
LEFT JOIN VAC_PERIODOCIA 
    ON COMPANIA.CIA_CLAVE = VAC_PERIODOCIA.CIA_CLAVE
    AND VAC_PERIODOCIA.PERIODO = '2018 - 2019'

执行逻辑是:先在VAC_PERIODOCIA表中匹配「公司ID一致+周期为2018-2019」的记录,匹配不到的公司行保留,对应VAC_PERIODOCIA字段为NULL,再通过CASE语句统一赋值。

方案2:先过滤右表再做左连接

SELECT  
    c.CIA_CLAVE, 
    c.CIA_NOM, 
    CASE 
        WHEN v.VAC_APLICA IS NULL THEN 'N' 
        ELSE 'Y'  
    END AS VAC_APLICA
FROM COMPANIA c
LEFT JOIN (
    SELECT CIA_CLAVE, VAC_APLICA
    FROM VAC_PERIODOCIA
    WHERE PERIODO = '2018 - 2019'
) v ON c.CIA_CLAVE = v.CIA_CLAVE

执行逻辑是:先把VAC_PERIODOCIA表中符合指定周期的记录提前筛选出来,再和全量公司表做左连接,最终返回结果和方案1完全一致。

结果说明

修正后会返回COMPANIA表的所有公司:

  • 存在对应周期关联记录的公司,VAC_APLICA返回'Y'
  • 无对应周期关联记录的公司,VAC_APLICA返回'N',完全符合预期结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 16:18:20