为什么这样查询跟直接查询的数量不一样

时间:2022-07-17 23:03:34
select a.yfks+b.ypid as yybm,a.ypmc,a.pddh,a.yplsj,a.pdrq from yf_pddj a 
 left join yf_dtkc b on(a.yfks = b.yfks and a.yphh = b.yphh

一直没明白,left join不是按 左连接为基础的? 为什么这样查询出来的数量跟直接查询yf_pddj的数量不一样?

看到里面的数据有些都是重复的,不知道是怎么个原因

6 个解决方案

#1


左连接以基础的,并不代替数量会和左边的边一样
如果右表在连接条件和与左表匹配的有一条以上,那么左连接就会有重复的了

#2


那要怎么查询,我就是想取yf_dtkc b 的b.ypid这个字段二

#3


左连接逻辑执行顺序如下:
1.迪卡尔连接   数据条数为 a*b
2.匹配on 之后的列
3.加入左表不匹配的行
只有on 之后两个表是1对1的才会出现 ,总数与单独查询左表的数据数一样

#4


引用 2 楼 YueLingYueLiang 的回复:
那要怎么查询,我就是想取yf_dtkc b 的b.ypid这个字段二
你这样连接没有问题,如果yf_dtkc里有两条符合条件的,你需要取哪一条

#5


哦 明白了 !谢谢两位

#6


左连接是指如果左边有记录 不满足连接条件(这里就是a.yfks = b.yfks and a.yphh = b.yphh)
那么他正常的连接就不会返回这一行。左连接对于这样的行(左表外部行)也会返回,右边的表的列都是NULL。
这个和记录数量没有直接关系。
左表行数和这个左表产生的行数没有直接关系。和这个有直接关系的是连接条件。
如果你这个条件是1对1 的。那么左表行数和你这个查询的行数肯定相等。
你这样如果在右表里面有2行记录满足这个条件。这样就会有2个b.ypid。(也行相等。也行不相等)


select a.yfks+(b.ypid) as yybm,a.ypmc,a.pddh,a.yplsj,a.pdrq from yf_pddj a 
 left join (select yfks,yphh,max(ypid)as ypid from yf_dtkc
group by yfks,yphh) b on(a.yfks = b.yfks and a.yphh = b.yphh

先分组在进行连接这样产生的记录肯定就和左表行数一样了。

#1


左连接以基础的,并不代替数量会和左边的边一样
如果右表在连接条件和与左表匹配的有一条以上,那么左连接就会有重复的了

#2


那要怎么查询,我就是想取yf_dtkc b 的b.ypid这个字段二

#3


左连接逻辑执行顺序如下:
1.迪卡尔连接   数据条数为 a*b
2.匹配on 之后的列
3.加入左表不匹配的行
只有on 之后两个表是1对1的才会出现 ,总数与单独查询左表的数据数一样

#4


引用 2 楼 YueLingYueLiang 的回复:
那要怎么查询,我就是想取yf_dtkc b 的b.ypid这个字段二
你这样连接没有问题,如果yf_dtkc里有两条符合条件的,你需要取哪一条

#5


哦 明白了 !谢谢两位

#6


左连接是指如果左边有记录 不满足连接条件(这里就是a.yfks = b.yfks and a.yphh = b.yphh)
那么他正常的连接就不会返回这一行。左连接对于这样的行(左表外部行)也会返回,右边的表的列都是NULL。
这个和记录数量没有直接关系。
左表行数和这个左表产生的行数没有直接关系。和这个有直接关系的是连接条件。
如果你这个条件是1对1 的。那么左表行数和你这个查询的行数肯定相等。
你这样如果在右表里面有2行记录满足这个条件。这样就会有2个b.ypid。(也行相等。也行不相等)


select a.yfks+(b.ypid) as yybm,a.ypmc,a.pddh,a.yplsj,a.pdrq from yf_pddj a 
 left join (select yfks,yphh,max(ypid)as ypid from yf_dtkc
group by yfks,yphh) b on(a.yfks = b.yfks and a.yphh = b.yphh

先分组在进行连接这样产生的记录肯定就和左表行数一样了。