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
相关产品推荐
相关产品推荐

