最近项目中碰到一个有关多表链接on 和where条件下数据的变换问题。做个简单整理:
select count(*) from “SAPHANADB”.“CDHDR” SCR
inner JOIN “SAPHANADB”.“CDPOS” SCS ON SCR.MANDANT = SCS.MANDANT AND SCR.OBJECTCLAS = SCS.OBJECTCLAS
AND SCR.OBJECTID = SCS.OBJECTID
AND SCR.CHANGENR = SCS.CHANGENR and (SCS.tabname=‘MARC’ or SCS.tabname=‘MBEW’ )
where SCR.objectclas = ‘MATERIAL’
可以看到显示有16805条数据,将where改为and
发现数据量没有变化。然后我们将inner join改为left join 和right join 看看
left join
righr join
很明显,数据量会发生变化。这是因为
当使用 left join 时,无论on的条件是否满足,都会返回左表的所有记录,对于满足的条件的记录,两个表对应的记录会连接起来,对于不满足条件的记录,那右表字段全部是null
当使用 right join 时,on与where类似,只不过是全部返回右表的所有记录
当使用 inner join 时,on与where完全相同。
on是在生成中间的临时表时起作用的先把不符合条件的记录过滤后才进行统计,它就可以减少中间运算要处理的数据,在数据比较多的情况下效率上要比较好点,where是生成临时表之后对连接表再进行过滤。