left join 的一些问题,不一定以左表为准,数据行数减少或者数据增多

 

left join 完,行数一定等于左表行数吗? 不一定!!

实验如下:

SELECT * FROM hdd_test1 a LEFT JOIN hdd_test2 b ON a.a_id = b.b_id LIMIT 144

8 rows (134ms)

idcreated_atupdated_ata_ididcreated_atupdated_atb_id
12018-10-09 10:10:10.02018-10-09 10:10:10.0112018-10-09 10:10:10.02018-10-09 10:10:10.01
22018-10-09 10:10:10.02018-10-09 10:10:10.0222018-10-09 10:10:10.02018-10-09 10:10:10.02
12018-10-09 10:10:10.02018-10-09 10:10:10.0132018-11-05 20:44:00.02018-11-05 20:44:00.01
12018-10-09 10:10:10.02018-10-09 10:10:10.0142018-11-05 20:44:04.02018-11-05 20:44:04.01
32018-10-09 10:10:10.02018-10-09 10:10:10.03    
42018-10-09 10:10:10.02018-10-09 10:10:10.04    
52018-10-09 10:10:10.02018-10-09 10:10:10.05    
62018-10-09 10:10:10.02018-10-09 10:10:10.06    

hdd_test1有6条记录, hdd_test2 有4条记录,直接left join ,产生6条记录,别高兴太早,看下面的查询:

SELECT * FROM hdd_test1 a LEFT JOIN hdd_test2 b ON a.a_id = b.b_id WHERE b.b_id > 1 LIMIT 144

1 row (37ms)查看CSV

idcreated_atupdated_ata_ididcreated_atupdated_atb_id
22018-10-09 10:10:10.02018-10-09 10:10:10.0222018-10-09 10:10:10.02018-10-09 10:10:10.02

 

如图所示,当where 条件在外,会先聚合后过滤,所以结果会变少

 

还有一种情况需要注意,left join 结果的行数也可能大于左表:

SELECT * FROM hdd_test1 LIMIT 144

2 rows (33ms)查看CSV

idcreated_atupdated_ata_id
12018-10-09 10:10:10.02018-10-09 10:10:10.01
22018-10-09 10:10:10.02018-10-09 10:10:10.02
SELECT * FROM hdd_test2 LIMIT 144

4 rows (34ms)查看CSV

idcreated_atupdated_atb_id
12018-10-09 10:10:10.02018-10-09 10:10:10.01
22018-10-09 10:10:10.02018-10-09 10:10:10.02
32018-11-05 20:44:00.02018-11-05 20:44:00.01
42018-11-05 20:44:04.02018-11-05 20:44:04.01
SELECT * FROM hdd_test1 a LEFT JOIN hdd_test2 b ON a.a_id = b.b_id LIMIT 144

4 rows (110ms)查看CSV

idcreated_atupdated_ata_ididcreated_atupdated_atb_id
12018-10-09 10:10:10.02018-10-09 10:10:10.0112018-10-09 10:10:10.02018-10-09 10:10:10.01
22018-10-09 10:10:10.02018-10-09 10:10:10.0222018-10-09 10:10:10.02018-10-09 10:10:10.02
12018-10-09 10:10:10.02018-10-09 10:10:10.0132018-11-05 20:44:00.02018-11-05 20:44:00.01
12018-10-09 10:10:10.02018-10-09 10:10:10.0142018-11-05 20:44:04.02018-11-05 20:44:04.01

看到没? 产生了四条记录,因为这个时候b 有重复的b_id,如果这时候计算a表值的count 或者sum ,结果会比预想的大。

虽然很简单,但是很容易犯错误

在使用 LEFT JOIN 进行查询时,如果没有查询出左表的全部数据,可能有以下几个原因: 1. 条件不匹配:LEFT JOIN 是根据连接条件将左表和右表进行关联的。如果左表中的某些数据在右表中没有匹配的记录,那么在结果中将会显示 NULL 值。这意味着可能存在连接条件不正确或者左表中的数据与右表中的数据没有匹配的情况。请检查连接条件是否正确,并确保左表和右表之间有匹配的数据。 2. 过滤条件:在使用 LEFT JOIN 进行查询时,如果在查询语句中使用了 WHERE 子句或者其他过滤条件,这可能会导致只返回满足条件的部分数据。请检查您的查询语句中的过滤条件,确保没有过滤掉左表数据。 3. 数据类型不匹配:在进行连接时,连接条件的数据类型必须匹配。如果左表和右表的连接条件使用了不匹配的数据类型,那么连接操作可能会失败,导致左表数据没有被正确关联和查询出来。请检查连接条件的数据类型,确保它们匹配。 4. 数据完整性问题:如果左表中存在缺失或者错误的数据,或者左表中的数据不符合预期的格式或规范,这可能导致无法正确查询出左表的全部数据。请检查左表中的数据是否符合预期,确保数据的完整性和正确性。 如果您仍然无法找到问题所在,建议您检查查询语句、数据和连接条件,并尝试逐步调试和排除可能的问题。您也可以提供更详细的查询语句和数据示例,以便更好地帮助您分析和解决问题
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值