多表联查:如何返回A、B表全量匹配数据及其他表匹配行?
解决SQL关联查询丢失数据的问题
你的问题出在后续的INNER JOIN会过滤掉前面LEFT JOIN得到的行:
当C表没有匹配A的行时,C.PK_Criteria是NULL,此时INNER JOIN D要求D.PK_Criteria必须等于C.PK_Criteria(NULL),而NULL和任何值都不匹配,这一行就会被直接过滤。同理,只要D、E、F任意一张表没有匹配行,INNER JOIN都会导致整行丢失,最终返回空结果。
要实现“保留A、B全量数据,其余表有匹配时补充信息”的目标,需要把所有后续的INNER JOIN替换为LEFT JOIN,同时修正语法错误:
Select A.Title, B.Status, D.Criteria, F.Criteria FROM A LEFT JOIN B ON B.PK = A.PK LEFT JOIN C ON C.PK = A.PK LEFT JOIN D ON D.PK_Criteria = C.PK_Criteria LEFT JOIN E ON E.PK = D.PK LEFT JOIN F ON F.PK_Criteria = D.PK_Criteria -- 补上缺失的ON关键字,修正关联条件语法
关键调整说明:
- 替换INNER JOIN为LEFT JOIN:LEFT JOIN会保留左侧表的所有行,右侧表有匹配时填充字段,无匹配时返回NULL,不会过滤掉前面A、B的有效数据。
- 修正F表的关联语法:原语句中
INNER JOIN F后直接写条件,缺少ON关键字,这是语法错误,必须补上才能正常执行。
内容的提问来源于stack exchange,提问作者SethD02
相关产品推荐
相关产品推荐

