如何在筛选时显示所有SQL行?含左连接查询示例
问题分析与解决
你的问题核心是WHERE子句中的b.c = '100'过滤掉了LEFT JOIN未匹配到表B的行——因为这些行的b.c值为NULL,NULL与任何值的比较结果都不成立,导致原本该保留的表A行被剔除,相当于把LEFT JOIN变成了INNER JOIN。
要保留表A的所有行,同时仅匹配表B中c='100'的记录,需要将b.c = '100'的条件移至LEFT JOIN的ON子句中,而非WHERE子句。
正确SQL语句
SELECT a.a, a.b, b.c FROM tableA a LEFT JOIN tableB b ON a.b = b.a AND b.c = '100' WHERE a.a = '1'
执行结果
a b c ------------------- 1 1 100 1 2 100 1 3 1 4 1 5 100
逻辑说明
LEFT JOIN的规则是保留左表(tableA)的全部行,右表(tableB)匹配到符合条件的记录则显示对应值,未匹配则显示NULL。将右表的过滤条件放在ON子句中,是在匹配阶段就只筛选表B中符合c='100'的记录;若放在WHERE子句中,则是在匹配完成后,直接剔除所有b.c不为100的行(包括NULL行)。
内容的提问来源于stack exchange,提问作者user3596617
相关产品推荐
相关产品推荐

