如何用SQL查询指定b表行及对应a表数据(无对应时仅返回b表行)
解决左连接查询需求:确保返回b表匹配行(无论a表是否存在对应数据)
你遇到的问题核心是内连接(INNER JOIN)的特性限制——它只会返回两张表中完全匹配连接条件的行,一旦a表没有对应b.foo的记录,整个结果就会为空。但你需要的是:只要b表中存在b.foo = 'some value'的行,无论a表有没有对应数据,都要返回b表的该行数据,有a表数据就一起带上。
解决方法很简单,把内连接换成左外连接(LEFT JOIN),它会保留左表(这里是b表)的所有匹配行,右表(a表)没有匹配时,对应列会填充为NULL。具体SQL语句如下:
SELECT * FROM b LEFT JOIN a ON b.foo = a.foo WHERE b.foo = 'some value';
为什么这个语句能满足需求?
- 首先,
WHERE b.foo = 'some value'会先筛选出b表中符合条件的行(你已经确认该行一定存在)。 - 然后通过
LEFT JOIN a ON b.foo = a.foo,尝试为每一行b表数据匹配a表中foo值相同的记录。 - 如果a表有匹配记录,就返回两表的所有列;如果没有,a表的列会显示为
NULL,但b表的完整数据依然会被返回。
这样就完美解决了内连接无结果的问题,完全符合你的查询要求。
内容的提问来源于stack exchange,提问作者Raphael Rafatpanah




