测试数仓数据过程中,会发现不同的sql写法,对结果集的影响不同
特别是on 和where 的区别
select * from X s2 LEFT JOIN Y s1 on s1.no = s2.no
where s1.month = ‘2025-04’
and s2.create_date BETWEEN ‘2025-04-01’ AND ‘2025-04-30’ and s2.position ='XXXX ’
这条sql我自己写的,查出来为11条数据,但业务平台计算12条数据
后来经过开发确认,这条sql写法有问题,导致数据丢失了一条
开发改成了这样
select * from X s2 LEFT JOIN Y s1 on s1.no = s2.no
and s1.month = ‘2025-04’
where
s2.create_date BETWEEN ‘2025-04-01’ AND ‘2025-04-30’ and s2.position ='XXXX ’
因此,结论就是放where后面是把两个表left join 关联出来后那条左表有数据,右表缺失的数据还存在,经过where字段将左表四月份数据再过滤,把左表非空右表为空的数据过滤掉了,导致最终结果数据会缺失一条数据。
两个表先各自过滤4月份数据,然后再进行关联,S1表有这条4月份数据,left join可以补上一条S2空数据
写sql过程中,注意on和where条件的区别,可能会影响sql查询结果。
2万+

被折叠的 条评论
为什么被折叠?



