问题:left join在以下两种情况下,为什么查询结果不同,左侧表什么时候需要加约束条件呢,这两种情况是不是用inner join更好呢?谢谢!
情况一: 为什么没有对a表做条件约束,就能实现筛选目标?
-- gct(table_id) 👉 data_resource_table(res_id,table_id) 👉 data_resource(res_id,cata_id)
-- 想查询gct表中table_id 对应的cata_id值 (134条)
select a.cata_id , a.res_name , b.table_name
from data_resource a left join data_resource_table b on a.res_id = b.res_id
where b.table_id in (select table_id from gct)
ORDER BY cata_id;
-- 这个语句使用left join 和 inner join 查询结果一致 都是恰好134条
情况二: 如果不对a表做约束,会显示一千多条数据,必须交换AB表位置,或者使用inner join,才能显示正确结果
-- gcxy2表有134条数据
SELECT a.cata_id , a.status
from data_catalog a left join gcxy2 b on a.cata_id = b.cata_id
-- where a.cata_id in (SELECT cata_id from gcxy2) 限制句加上才对,不加就显示1千多条
ORDER BY a.cata_id;
这个问题是这样的, 首先你要理解什么是left join , 什么是right join, 什么是 inner join
left join, 左连接, 表示: 左表数据为准和右表进行连接, 不论右表是否有对应数据. 这叫左连接, 也就是说: 如果左表有条id为1的数据,而右表没有, 此时这条数据依然会显示出来, 只不过右表部分显示的全是null, 你用 select * from a left join b on a.id = b.id 即可看出来
rigth join, 右连接, 表示: 正好和左连接相反, 即上述的左表换成右表, 右表换成左表即可
inner join, 自连接, 表示: 以左右表数据为准, 进行表连接. 因此: 在inner join下, 左表和右表必须都有数据对应, 否则无法连接.
这就是你上述的问题, 因为你使用左连接时, 假如是1对1关系,即左表1条数据在右表最大只有1条数据对应(可以没有), 此时结果永远是左表数据行, 即左表有多少数据, 则左连接有多少数据, 这就是你的问题.
当你上述换成右连接时, 正好反过来, 是右表的数据, 即右表有多少数据, 结果就有多少, 但是此时左表数据可能为null, 显然结果也是不正确的.
因此: 你上述的结果应该使用自连接即(inner join), 此时会筛选出相关联的数据.
希望关注和采纳谢谢!!!
这就是在 on后边加条件 跟在where后边加条件的区别,where后边加就是对关联好的数据进行筛选,on后边加只会影响左表数据 详细可以参考下这个http://t.csdn.cn/gt20k
我的代码中,有一条查询语句:select * from A left join B on A.order_no=B.order_no where xxxxxx
其中A表B表都是4万条数据左右,我单独拿出这条sql在Navicat中跑,查询起来非常地慢,竟然用了320秒