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

MySQL两表左连接查询:需保留主表数据的问题求解

问题解决:左连接后过滤导致主表数据丢失的处理

现有数据表

表 - Utente

codigonome
105teste
206teste1
302teste2

表 - MapIncont

codUteDia
1053-Noite
1054-SOS
2061-Manhã
2062-Tarde
2063-Noite
2064-SOS

问题场景

我希望即使MapIncont表无匹配数据,也始终返回Utente表的对应数据。

比如执行以下查询时,能正常返回匹配结果:

SELECT codigo, nome, codUte
FROM Utente LEFT OUTER JOIN MapIncont ON MapIncont.codUte = Utente.codigo 
WHERE codigo = 206 AND Dia = '1-Manhã'

返回结果:

codigonomecodUte
206teste1206

但执行下面的查询时,因为codigo=105在MapIncont中没有Dia = '1-Manhã'的记录,当前返回空结果:

SELECT codigo, nome, codUte
FROM Utente LEFT OUTER JOIN MapIncont ON MapIncont.codUte = Utente.codigo 
WHERE codigo = 105 AND Dia = '1-Manhã'

而我期望返回:

codigonomecodUte
105teste

解决方案

问题核心是过滤条件的位置错误:

  • 把Dia = '1-Manhã'放在WHERE子句时,左连接后右表无匹配的行(Dia为NULL)会被这个条件过滤掉——因为NULL和任何值比较都不成立,最终导致主表数据也丢失。
  • 正确做法是将针对MapIncont表的过滤条件移到LEFT OUTER JOIN的ON子句中,这样只会在连接阶段筛选符合条件的右表行,Utente表的行无论是否有匹配都会被保留。

修改后的查询语句:

SELECT codigo, nome, codUte
FROM Utente 
LEFT OUTER JOIN MapIncont 
    ON MapIncont.codUte = Utente.codigo 
    AND Dia = '1-Manhã'
WHERE codigo = 105

执行这条语句后,就能得到期望的结果:Utente表中codigo=105的行正常显示,MapIncont相关字段因无匹配显示为空(NULL)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 00:04:52