MySQL两表左连接查询:需保留主表数据的问题求解
问题解决:左连接后过滤导致主表数据丢失的处理
现有数据表
表 - Utente
| codigo | nome |
|---|---|
| 105 | teste |
| 206 | teste1 |
| 302 | teste2 |
表 - MapIncont
| codUte | Dia |
|---|---|
| 105 | 3-Noite |
| 105 | 4-SOS |
| 206 | 1-Manhã |
| 206 | 2-Tarde |
| 206 | 3-Noite |
| 206 | 4-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ã'
返回结果:
| codigo | nome | codUte |
|---|---|---|
| 206 | teste1 | 206 |
但执行下面的查询时,因为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ã'
而我期望返回:
| codigo | nome | codUte |
|---|---|---|
| 105 | teste |
解决方案
问题核心是过滤条件的位置错误:
- 把
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
相关产品推荐
相关产品推荐

