SQL SERVER中关于exists 和 in的简单分析

所属分类: 数据库 / MsSql 阅读数: 1631
收藏 0 赞 0 分享

In与Exists这两个函数是差不多的,但由于优化方案不同,通常NOT Exists要比NOT IN要快,因为NOT EXISTS可以使用结合算法二NOT IN就不行了,而EXISTS则不如IN快,因为这时候IN可能更多的使用结合算法。

如图,现在有两个数据集,左边表示#tempTable1,右边表示#tempTable2。现在有以下问题:

1.求两个集的交集?

2.求tempTable1中不属于集#tempTable2的集?

先创建两张临时表:

create table #tempTable1
(
  argument1 nvarchar(50),
  argument2 varchar(20),
  argument3 datetime,
  argument4 int
);
insert into #tempTable1(argument1,argument2,argument3,argument4)
values('preacher001','13023218757',GETDATE()-1,1);
insert into #tempTable1(argument1,argument2,argument3,argument4)
values('preacher002','23218757',GETDATE()-2,2);
insert into #tempTable1(argument1,argument2,argument3,argument4)
values('preacher003','13018757',GETDATE()-3,3);
insert into #tempTable1(argument1,argument2,argument3,argument4)
values('preacher004','13023257',GETDATE()-4,4);
insert into #tempTable1(argument1,argument2,argument3,argument4)
values('preacher005','13023218',GETDATE()-5,5);
insert into #tempTable1(argument1,argument2,argument3,argument4)
values('preacher006','13023218',GETDATE()-6,6);
insert into #tempTable1(argument1,argument2,argument3,argument4)
values('preacher007','13023218',GETDATE()-7,7);
insert into #tempTable1(argument1,argument2,argument3,argument4)
values('preacher008','13023218',GETDATE()-8,8);

create table #tempTable2
(
  argument1 nvarchar(50),
  argument2 varchar(20),
  argument3 datetime,
  argument4 int
);
insert into #tempTable2(argument1,argument2,argument3,argument4)
values('preacher001','13023218757',GETDATE()-1,1);
insert into #tempTable2(argument1,argument2,argument3,argument4)
values('preacher0010','23218757',GETDATE()-10,10);
insert into #tempTable2(argument1,argument2,argument3,argument4)
values('preacher003','13018757',GETDATE()-3,3);
insert into #tempTable2(argument1,argument2,argument3,argument4)
values('preacher004','13023257',GETDATE()-4,4);
insert into #tempTable2(argument1,argument2,argument3,argument4)
values('preacher009','13023218',GETDATE()-9,9);

比如,我现在以#tempTable1和#tempTable2的argument1作为参照

1.求两集的交集:

1)in 方式

select * from #tempTable2 where argument1 in
(select argument1 from #tempTable1)

2)exists 方式

select * from #tempTable2 t2 where exists 
(select * from #tempTable1 t1 where t1.argument1=t2.argument1)

2.求tempTable1中不属于集#tempTable2的集

1)in 方式

select * from #tempTable1 where argument1 not in
(select argument1 from #tempTable2)

2)exists 方式

select * from #tempTable1 t1 where not exists 
(select * from #tempTable2 t2 where t1.argument1=t2.argument1)

更多精彩内容其他人还在看

一个函数解决SQLServer中bigint 转 int带符号时报错问题

这篇文章主要介绍了解决SQLServer中bigint 转 int带符号时报错问题的函数,需要的朋友可以参考下
收藏 0 赞 0 分享

SQLServer恢复表级数据详解

这篇文章主要介绍了SQLServer中用于快速恢复表,而不是库,但是切记,防范总比亡羊补牢好,需要的朋友可以参考下
收藏 0 赞 0 分享

SQLSERVER 清除历史记录的方法

使用SQL Server登录使用数据库时,登录过的记录会出现在登录框中,下面是删除方法,需要的朋友可以参考下
收藏 0 赞 0 分享

浅析SQL server 临时表

这篇文章主要介绍了SQL server 临时表的创建查询以及使用过程中应注意的事项,需要的朋友可以参考下
收藏 0 赞 0 分享

MSSQL段落还原脚本,SQLSERVER段落脚本

“段落还原”(在 SQL Server 2005 中引入)允许分阶段还原和恢复包含多个文件组的数据库。段落还原包括从主文件组开始(有时也从一个或多个辅助文件组开始)的一系列还原序列。
收藏 0 赞 0 分享

SQL SERVER中关于exists 和 in的简单分析

这篇文章主要介绍了SQL SERVER中关于exists 和 in的简单分析,需要的朋友可以参考下
收藏 0 赞 0 分享

Transactional replication(事务复制)详解之如何跳过一个事务

事务复制由 SQL Server 快照代理、日志读取器代理和分发代理实现。 快照代理准备快照文件(其中包含了已发布表和数据库对象的架构和数据),然后将这些文件存储在快照文件夹中,并在分发服务器中的分发数据库中记录同步作业。
收藏 0 赞 0 分享

SQL语句中含有乘号报错的处理办法

这篇文章主要介绍了SQL语句中含有乘号报错的处理办法,需要的朋友可以参考下
收藏 0 赞 0 分享

SQL SERVER先判断视图是否存在然后再创建视图的语句

SQL SERVER中先判断视图是否存在,使用IF NOT EXISTS,然后再创建视图,使用create view,整个过程如下
收藏 0 赞 0 分享

sql中循环处理当前行数据和上一行数据相加减

曾经,sql中循环处理当前行数据和上一行数据浪费了我不少时间,学会后才发现如此容易,其实学问就是如此,难者不会,会者不难。
收藏 0 赞 0 分享
查看更多