【Transact-SQL】SQL Server自动把left join自动转化为inner join、以及关联时的数据重复问题

原文:【Transact-SQL】SQL Server自动把left join自动转化为inner join、以及关联时的数据重复问题

1、SQL Server自动把left join自动转化为inner join的问题:

下面的两个语句都是left join的,但是一个却转化成了 inner join


  1. drop table a,B
  2. go
  3. create table a(id int)
  4. insert into a
  5. select 1 union all
  6. select 2
  7. create table b(id int,xxx varchar(10))
  8. insert into b
  9. select 1,‘xxx‘ union all
  10. select 2,‘xx‘
  11. go
  12. --这个还是left join
  13. select *
  14. from a
  15. left join b
  16. on a.id = b.id and b.xxx = ‘xxx‘
  17. /*
  18. id id xxx
  19. 1 1 xxx
  20. 2 NULL NULL
  21. */
  22. select * --这个就是转化为inner join
  23. from a
  24. left join b
  25. on a.id = b.id
  26. where b.xxx = ‘xxx‘
  27. /*
  28. id id xxx
  29. 1 1 xxx
  30. */

下面的图是执行计划:

2、下面的语句,运行后会出来几条记录呢?


  1. select*
  2. from
  3. (
  4. select 1 as id
  5. )a
  6. left join
  7. (
  8. select 1 as id
  9. union all
  10. select 1
  11. )b
  12. on a.id = b.id
  13. left join
  14. (
  15. select 1 as id
  16. union all
  17. select 1
  18. )c
  19. on a.id = c.id

之所以会想到这个问题,是因为发现最近写的报表总是运行结果不对,数字偏大,报表的逻辑要比上面的语句复杂,但问题是一样的。

首先,查询结果要求出来明细数据,由于表a关联了表b,虽然表a中没有重复记录,但是表b中有重复记录,导致表a的一条记录与表b的2条记录关联时,结果集会有2条,然后再把产生的结果集再与表c关联,这时由于c表中也有重复数据,那么最后的结果集就会是4条。

看上去和笛卡尔积一样2*2 = 4,但其实是由于表b和表c都有重复记录,导致关联以后出现大量的重复数据,这个问题在写SQL语句的时候,一定要非常注意。

如果来解决这个问题呢?

一般可以先单独对有重复数据表进行去重,或者group by并按照需求进行聚合计算,然后再进行关联,这样就不会导致数字偏大。


不想长大啊

发布了416 篇原创文章 · 获赞 135 · 访问量 94万+

他的留言板
关注

原文地址:https://www.cnblogs.com/lonelyxmas/p/12019961.html

时间: 2024-08-03 01:20:52

【Transact-SQL】SQL Server自动把left join自动转化为inner join、以及关联时的数据重复问题的相关文章

SQL Server 2008如何创建定期自动备份任务(二)_异地备份

准备: 局域网内的两台电脑.主电脑,备份电脑. 原理:通过数据库维护计划实现. 操作步骤: 一.在备份电脑和主电脑上中创建一个账户liuxh和密码123(自定义) 二.在备份电脑中创建备份用的文件夹backfile并将其共享给指定用户soft1_developer6. 如图: 1.选择用户 2.分配权限 以上上步骤是把文件夹开启共享.       其余步骤同SQL Server 2008如何创建定期自动备份任务,保存路径改成共享目录的文件夹目录.

功能齐全、效率一流的免费开源数据库导入导出工具(c#开发,支持SQL server、SQLite、ACCESS三种数据库),每月借此处理数据5G以上

软件名:DataPie 功能:支持SQL server.SQLite.ACCESS数据库的导入.导出.存储过程调用,支持EXCEL2007.EXCEL2003.ACCESS2007. CSV文件导入数据库,支持EXCEL.CSV.ZIP.ACCESS文件方式导出,支持数据拆分导出及自定义SQL查询与导出. 开发背景:作者从事财务管理工作,主要是出具集团的内部财务报表,随着公司精细化管理的需求,管理报表的数据量急速增长, 依赖EXCEL加工处理数据已经变得极为困难,因此团队全面转向关系数据库进行数

创建并设置ASP.NET的会话状态服务器(SQL State Server)

首先创建服务器数据库ASPState: C:\Windows\Microsoft.NET\Framework64\v4.0.30319>aspnet_regsql -ssadd -sstype p -E  -S .\SQLExpress 执行数据库脚本Script:USE ASPStateGOCREATE USER [adr] FOR LOGIN [adr] WITH DEFAULT_SCHEMA=[dbo]GOEXEC sp_addrolemember  'db_datareader', 'a

[SQL]SQL Server 2014 SP1 重新发行了

在 2015/4/16 微软第一次发布 SQL Server 2014 SP1,但没有想到不到一天就因为 SSISDB 的问题,造成许多人更新之后无法正常启动( 我就是那倒楣的其中一人),导致隔天这个 Server Pack 就下架了.而到今天微软又重新发行 SQL Server 2014 SP1 了. 之前发布的时候,有问题的文件是 SQLServer2014SP1-KB3018269-x64-CHT,而今天重新发行的是 SQLServer2014SP1-KB3058865-x64-CHT.e

退役笔记一#MySQL = lambda sql : sql + ' Source Code 4 Explain Plan '

Mysql 查询执行过程 大致分为4个阶段吧: 语法分析(sql_parse.cc<词法分析, 语法分析, 语义检查 >) >>sql_resolver.cc # JOIN.prepare 生成逻辑查询plan(sql_optimizer.cc) >># JOIN.optimize 生成物理查询plan(sql_planner.cc) run the explain plan(sql_executor.cc) 退役笔记一#MySQL = lambda sql : sql

sql: sql developer tunnel转接

Use putty tunnel instead of login terminal server 有时候本地直接ping不通sql 的server, 但另一个server能连上,这时就可以把端口和ip重定位一下, 通过另一个server转接. in putty ssh settings: 12345 //new_port 10.140.85.51:1570 //ip:old_port in sql developer: hostname: localhost port:new_port SID

退役笔记一#MySQL = lambda sql : sql + &amp;#39; Source Code 4 Explain Plan &amp;#39;

Mysql 查询运行过程 大致分为4个阶段吧: 语法分析(sql_parse.cc<词法分析, 语法分析, 语义检查 >) >>sql_resolver.cc # JOIN.prepare 生成逻辑查询plan(sql_optimizer.cc) >># JOIN.optimize 生成物理查询plan(sql_planner.cc) run the explain plan(sql_executor.cc) JOIN.exec JOIN.prepare() : 子查询

windows server 2003断开远程之后自动注销用户

windows server 2003断开远程之后自动注销用户 2011-07-30 09:42:52     我来说两句      收藏    我要投稿 最近一台服务器老是断开远程之后过没多久就自动注销(是由nagios报警explorer.exe得出结论),后查看系统日志信息,确实为注销. 解决办法如下: 开始-->运行-->gpedit.msc 计算机配置->管理模板->Windows组件->终端服务->会话 把"为断开的会话设置时间限制"改为

配置Tomcat时server.xml和content.xml自动还原问题

转载:http://www.tuicool.com/articles/iuu6bqF[配置Tomcat时server.xml和content.xml自动还原问题] 当我们在处理中文乱码或是配置数据源时,我们要修改Tomcat下的server.xml和content.xml文件. 但是当我们修改完后重启Tomcat服务器时发现xml文件又被还原了,修改无效果. 为什么会还原? Tomcat服务器在Eclipse中启动时,会自动发布Eclipse中部署的项目,但是我的项目是自己手动在外面部署的,Ec