【Transact-SQL】SQL Server自动把left join自动转化为inner join、以及关联时的数据重复问题
2013-04-25 20:19
375 查看
1、SQL Server自动把left join自动转化为inner join的问题:
下面的两个语句都是left join的,但是一个却转化成了 inner join
drop table a,B go create table a(id int) insert into a select 1 union all select 2 create table b(id int,xxx varchar(10)) insert into b select 1,'xxx' union all select 2,'xx' go --这个还是left join select * from a left join b on a.id = b.id and b.xxx = 'xxx' /* id id xxx 1 1 xxx 2 NULL NULL */ select * --这个就是转化为inner join from a left join b on a.id = b.id where b.xxx = 'xxx' /* id id xxx 1 1 xxx */
下面的图是执行计划:
2、下面的语句,运行后会出来几条记录呢?
select* from ( select 1 as id )a left join ( select 1 as id union all select 1 )b on a.id = b.id left join ( select 1 as id union all select 1 )c on a.id = c.id
之所以会想到这个问题,是因为发现最近写的报表总是运行结果不对,数字偏大,报表的逻辑要比上面的语句复杂,但问题是一样的。
首先,查询结果要求出来明细数据,由于表a关联了表b,虽然表a中没有重复记录,但是表b中有重复记录,导致表a的一条记录与表b的2条记录关联时,结果集会有2条,然后再把产生的结果集再与表c关联,这时由于c表中也有重复数据,那么最后的结果集就会是4条。
看上去和笛卡尔积一样2*2 = 4,但其实是由于表b和表c都有重复记录,导致关联以后出现大量的重复数据,这个问题在写SQL语句的时候,一定要非常注意。
如果来解决这个问题呢?
一般可以先单独对有重复数据表进行去重,或者group by并按照需求进行聚合计算,然后再进行关联,这样就不会导致数字偏大。
相关文章推荐
- 【Transact-SQL】SQL Server自动把left join自动转化为inner join、以及关联时的数据重复问题
- https post调用以及前端到后台中传输数据encode和decode的自动转化问题
- Sql Server 2005 与Sql Server Mobile(Sql server 2005 mobile Edition)数据同步步骤以及问题解决方案
- Sql Server 2005 与Sql Server Mobile(Sql server 2005 mobile Edition)数据同步步骤以及问题解决方案
- sql server 数据类型以及SqlParameter赋值时遇到的问题
- 将表中的数据生成SQL脚本,在查询分析器中执行这些脚本后自动将数据导入到SQL Server中
- Sql之left join(左关联)、right join(右关联)、inner join(自关联)的区别
- 【SQL】在SQL Server中多表关联查询问题
- hibernate使用原生sql查询Hibernate原生SQL多表查询字段名重复问题以及解决方法
- SQL中的LEFT JOIN 和 RIGHT JOIN 以及INNER JOIN
- SQL 筛选掉某字段重复的数据以及计算查询到的数据
- 解决浏览器自动填充的问题,以及前者引起的serialize()方法序列号参数重复的问题
- Sql语句用left join 解决多表关联问题(关联套关联,例子和源码)
- 【SQL Server 2005 的问题】com.microsoft.sqlserver.jdbc.SQLServerException: 用户 'sa' 登录失败。该用户与可信 SQL Server 连接无关联。
- 导入数据常出现 重复的数据 下面介绍几条sql语句来解决问题!!
- 【转载】Sql语句用left join 解决多表关联问题(关联套关联,例子和源码)
- SQL Server 将表中数据,转化成SQL Insert语句
- sql 2005 中如何自动生成不重复的,长度相同字符串作为一个数据表的id
- Python删除列表重复数据以及效率问题
- hibernate在使用sql查询query自动转化成model类型数据,query.addEntity