SQL查询不匹配记录求助:两表外连接未获预期结果
解决Table1与Table2的左外连接查询问题
首先,你想要的是以Table1为主表的左外连接,目的是保留Table1中所有的product_source记录,同时关联Table2中对应的item值,当Table2没有匹配的product_id时显示NULL。你的现有语句问题出在连接的方向或者语法使用上,以下是正确的解决方案:
方法1:标准SQL LEFT OUTER JOIN语法(推荐)
这种写法兼容性最好,几乎所有主流数据库都支持:
SELECT t1.product_source, t2.item FROM Table1 t1 LEFT OUTER JOIN Table2 t2 ON t1.product_id = t2.product_id;
语法解释:
LEFT OUTER JOIN(可简写为LEFT JOIN)会保留左表(这里是Table1 t1)的所有行- 当右表(
Table2 t2)中找不到与左表product_id匹配的记录时,右表的列(这里是item)会填充为NULL - 使用表别名
t1、t2可以让语句更简洁易读
方法2:Oracle风格的(+)外连接语法
如果你使用的是Oracle数据库,也可以修正你之前的写法,注意(+)的位置要对应右表的关联字段:
SELECT t1.product_source, t2.item FROM Table1 t1, Table2 t2 WHERE t1.product_id = t2.product_id(+);
这里的(+)放在Table2.product_id后面,表示这是左外连接,即左表的所有行都会被保留,右表匹配不到的字段为NULL。你之前的写法把(+)放在了左表字段上,导致连接方向反了,所以得不到预期结果。
执行结果验证
执行上述任意语句后,都会得到你期望的结果:
| product_source | item |
|---|---|
| CRM | item1 |
| CRM | item2 |
| CNT | NULL |
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

