LEFT JOIN使用问题咨询:我的这条SQL左连接查询存在什么错误?
你的LEFT JOIN问题分析与修复方案
嘿,我来帮你拆解下这个LEFT JOIN的问题~
你当前的SQL查询里,虽然用了LEFT JOIN,但把LDN.language_id = 1放在了WHERE子句中,这直接抵消了LEFT JOIN的核心特性,让它的效果和INNER JOIN完全一样了。
问题根源
LEFT JOIN的设计初衷是:即使右表(LsDiseaseName)没有匹配到符合条件的行,左表(LsDiseases)的行也会被保留,右表对应的列会填充为NULL。但当你在WHERE子句中添加LDN.language_id = 1时,一旦右表没有匹配行,LDN.language_id的值是NULL,而NULL = 1的判断结果是不成立的,这些本该被保留的左表行就会被WHERE条件过滤掉,最终结果就和用INNER JOIN查询的结果一致了。
修复方案
把LDN.language_id = 1这个条件移动到LEFT JOIN的ON子句中,这样在进行表匹配的时候就只会筛选右表中language_id=1的行,即使没有匹配到,左表的行依然会被保留:
SELECT LD.id AS disease_id, LD.disease_name_en AS disease_name_en, LDN.disease_name AS disease_name, LDN.description AS description, LD.image_link AS image_link FROM LsDiseases AS LD LEFT JOIN LsDiseaseName AS LDN ON LDN.disease_id = LD.id AND LDN.language_id = 1 -- 将条件移至此处 WHERE LD.id = 1
这样修改后,如果id=1的疾病在LsDiseaseName中没有language_id=1的对应记录,查询结果依然会返回该疾病的基础信息(disease_id、disease_name_en、image_link),而disease_name和description会显示为NULL,这才符合LEFT JOIN的预期效果。
内容的提问来源于stack exchange,提问作者AndreaNobili
相关产品推荐
相关产品推荐

