如题所示,我们有的时候直接使用左连接查询,当右表不存在该数据的时候,是可以查出带有 null 的列。可是当在 where 条件中有右表相关的筛选条件时,我们惊奇的发现查询的结果不带 null 值了,换句话说就是查出来的结果比预期的少。

博主之前遇到过这个问题,只不过当时解决了就没记录。谁知道前两天有朋友问到这个 sql nnd 给忘记了,又耗费了大半个小时,这里还是记录下。

二、错误复现以及解决方案

1、右表不带筛选条件的查询

sql 相关的表主要是 w_order (订单表)和 w_a_info (商品种类表):

SELECT
  o.id ,
 a.name,
 o.order_time
 w_a_info AS a
  left JOIN w_order AS o ON a.id = o.infoid
WHERE
  a.ifshow = 200
GROUP BY
 a.id
id		name			order_time
11		好愧开语音泼猴	1574341554
12		饸烙面			1574587287
9		黄焖鸡米饭		1574340342
NULL	黄焖鸡1			NULL

这里能看到,我们查询出来的有带有NULL值的列。

2、右表带有筛选条件

SELECT
  o.id ,
 a.name,o.order_time
 w_a_info AS a
  left JOIN w_order AS o ON a.id = o.infoid
WHERE
  a.ifshow = 200
  and o.order_time>0
GROUP BY
 a.id
id		name			order_time
11		好愧开语音泼猴	1574341554
12		饸烙面			1574587287
9		黄焖鸡米饭		1574340342

      根据结果发现,我们原来带有null值的列消失了,是的,是被where中的筛选条件给筛选掉了。只是有时候我们的需求是要获取所有的商品信息的,因此这个null列还不能被筛选掉,不然就造成数据缺失了。

      这里推测是因为sql的执行顺序,on表连接是先于where条件的,因此我们先on连接之后,产生了不符合条件的NULL列,然后NULL列被where条件给筛选掉了。这里解决方案是把右表的筛选条件放到前面去,也就是连表的地方去。

3、左连接之后加筛选条件

SELECT
  o.id ,
 a.name,
 o.order_time
 w_a_info AS a
  left JOIN w_order AS o ON a.id = o.infoid AND o.order_time>0
WHERE
  a.ifshow = 200
GROUP BY
 a.id
id		name			order_time
11		好愧开语音泼猴	1574341554
12		饸烙面			1574587287
9		黄焖鸡米饭		1574340342
NULL	黄焖鸡1			NULL

      这里我们把筛选条件放到连接处,通过on ... and ... 的方式,在连接时就附带上条件,此时不符合条件的数据列还是以null值的方式展现,并不会被后续的where筛选条件给筛选掉。

一、前言      如题所示,我们有的时候直接使用左连接查询,当右表不存在该数据的时候,是可以查出带有null的列。可是当在where条件中有右表相关的筛选条件时,我们惊奇的发现查询的结果不带null值了,换句话说就是查出来的结果比预期的少。      博主之前遇到过这个问题... public void finishSubTask(SubTask subTask){ // 进行子任务状态更新 subTaskService.updateFinish(subTask);
IFNULL(fieldA,fieldB),当字段fieldA是NULL时取fieldB,不是NULL时取fieldA的问题:需要联接查询交易相关的联系人名称,当交易表中联系人字段为null时,mybaties查询的结果会自动过滤掉null SQL1: select t.id,c.fullname as contactName from tbl_trans t
left join 或 right join :1) select * from 表1 left join 表2 on 表1=表2 where 表1.id>10 ; //不考虑表2 的重复有40条数据 返回 表1 的所有数据40条。如果表2中没有对应的null 返回。 2) select * from 表1 left join 表2 on 表1=表2 where 表1.i
1、当使用where+条件时,左连接查询空丢失 SELECT u.id, u.authority_type, sum(complete_value) FROM USER as u LEFT JOIN `performance_assess` p ON p.user_id = u.id where p.assess_time>'2020-09-
sql中left join 后难免会出现null,如果正好用此列进行排序,会发现,null一直在负数的后边, 比如有2、4、30、-3、-13、nullnullnull desc时,显示的顺序为 30、4、2、 -3、 -13、nullnullnull,明显不是我想要的,其实,null是想做0用的, 此时需要在order by 里判断是否为null,如果是就替换成0就行了,写法如下
--表1: 姓名 create table app.test_boa_1 (id string ,name string ); insert into app.test_boa_1 values (1,'安妮'); insert into app.test_boa_1 values (2,'盖伦'); insert into app.test_boa_1 values (3,'光辉'); --表2:工资 create table app.test_boa_2 (id string ,sal
命令行mvn打包的时候报错:No compiler is provided in this environment. Perhaps you are running on a JRE 樱影268: 天哪,我也是这样,感谢提醒! Langchain-Chatchat之pdf转markdown格式 铁柱同学: 这种情况,你可以自定义文档分割部分,比如根据特殊符号去分割文档,你加载文档的时候插入特殊符号这些。 或者用markdown,设置合理的head 等级,分割出来的语义保存也不错的 mysql的表最多可设置多少字段? 铁柱同学: 好听了,不过不精准了表情包