大家好,又见面了,我是你们的朋友全栈君。
一、前言
如题所示,我们有的时候直接使用左连接查询,当右表不存在该数据的时候,是可以查出带有null
的列。可是当在where
条件中有右表相关的筛选条件时,我们惊奇的发现查询的结果不带null
值了,换句话说就是查出来的结果比预期的少。
博主之前遇到过这个问题,只不过当时解决了就没记录。谁知道前两天有朋友问到这个sql
,nnd
给忘记了,又耗费了大半个小时,这里还是记录下。
二、错误复现以及解决方案
1、右表不带筛选条件的查询
sql
相关的表主要是w_order
(订单表)和w_a_info
(商品种类表):
SELECT
o.id ,
a.name,
o.order_time
FROM
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
FROM
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
FROM
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
筛选条件给筛选掉。
end
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/137920.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...