left join中的筛选条件放到on之后还是where后面

本文对比了两种SQL联表查询方式:一种是先按条件进行联接,另一种是在联接后进一步筛选。通过实例说明了left join和right join在不同场景下的应用及on子句的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.表1 


2.表2 



第一条sql

select * from test_1 t1 left join test_2 t2 on (t1.name=t2.name and t2.name='name1');


查询结果

,这里sql中的t2.name换成t1.name效果是一样的


第二条sql

select * from test_1 t1 left join test_2 t2 on t1.name=t2.name where t1.name='name1';



两种查询方式 ,就是第一种先按照条件关联,也会将冗余的结果显示出来;第二种直接先关联,再在结果中筛选,直接显示要的结果。


之前没明白同事为什么选第一种,后来发现是业务需求。。。




后来同事说转换成right join,实验完发现,无论是left join还是right,on后面的筛选条件无论是什么,都是显示主表的所有数据。

### SQL Left Join 连接条件不匹配时无法正确显示左表所有记录的原因分析 在SQL查询中,`LEFT JOIN` 的行为应当是在右表不存在匹配记录的情况下仍然保留左表的所有记录,并将右表对应的列填充为 `NULL`。然而,有时可能会遇到即使指定了 `LEFT JOIN` ,但在某些情况下表现得像 `INNER JOIN` 一样只返回有匹配的结果。 这种情况通常是由以下几个原因造成的: - **额外的过滤条件放置不当**:如果在 `WHERE` 子句中加入了针对右表字段的非空约束或其他严格条件,则会无意间把那些原本应该被保留下来的左表独占行给排除掉[^1]。 例如,在给出的例子中: ```sql SELECT * FROM quality_process_inspection qpi LEFT JOIN another_table at ON qpi.some_column = at.matching_column WHERE at.another_field IS NOT NULL; ``` 上述查询实际上会在最后一步筛选阶段丢弃任何来自 `quality_process_inspection` 表但是未能找到对应关系的数据行,因为此时 `at.another_field` 将会被设为 `NULL` 而不符合 `IS NOT NULL` 条件。 为了修正这个问题,可以考虑调整逻辑到 `JOIN ... ON` 部分而不是放在 `WHERE` 中处理;或者更谨慎地设计整个查询语句来确保预期的行为得以保持。 ### 正确展示左表所有记录的方法 要确保无论是否存在关联都能看到左边表格里的全部条目,可采取下面几种方法之一: #### 方法一:移除不必要的 WHERE 条件或将它们移到 ON 后面 对于原始问题描述中的情况,可以通过修改查询如下所示来进行修复: ```sql -- 假定 'another_table' 是右边参与 LEFT JOIN 的表名 SELECT * FROM quality_process_inspection qpi LEFT JOIN another_table at ON qpi.some_column = at.matching_column AND at.is_deleted = 0 -- 把 is_deleted=0 放入 ON 子句里 ``` 这样做的好处是可以让所有的 `quality_process_inspection` 记录都得到展现,而不会由于后续的 `WHERE` 约束而导致丢失数据。 #### 方法二:使用 CASE WHEN 或 COALESCE 函数控制输出 另一种解决方案涉及利用函数如 `CASE WHEN` 或者 `COALESCE()` 对特定场景下的值进行特殊处理,从而不影响整体结果集大小的同时达到所需效果。比如: ```sql SELECT qpi.*, CASE WHEN at.id IS NULL THEN 'No Match Found' ELSE CONCAT('Matched with ID:', CAST(at.id AS CHAR)) END as match_info FROM quality_process_inspection qpi LEFT JOIN another_table at ON qpi.some_column = at.matching_column; ``` 这种方法不仅能够维持完整的左表记录列表,还可以提供关于是否有成功配对的信息反馈。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值