如图,现在有两个数据集,左边表示#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','',GETDATE()-1,1);
insert into #tempTable1(argument1,argument2,argument3,argument4)
values('preacher002','',GETDATE()-2,2);
insert into #tempTable1(argument1,argument2,argument3,argument4)
values('preacher003','',GETDATE()-3,3);
insert into #tempTable1(argument1,argument2,argument3,argument4)
values('preacher004','',GETDATE()-4,4);
insert into #tempTable1(argument1,argument2,argument3,argument4)
values('preacher005','',GETDATE()-5,5);
insert into #tempTable1(argument1,argument2,argument3,argument4)
values('preacher006','',GETDATE()-6,6);
insert into #tempTable1(argument1,argument2,argument3,argument4)
values('preacher007','',GETDATE()-7,7);
insert into #tempTable1(argument1,argument2,argument3,argument4)
values('preacher008','',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','',GETDATE()-1,1);
insert into #tempTable2(argument1,argument2,argument3,argument4)
values('preacher0010','',GETDATE()-10,10);
insert into #tempTable2(argument1,argument2,argument3,argument4)
values('preacher003','',GETDATE()-3,3);
insert into #tempTable2(argument1,argument2,argument3,argument4)
values('preacher004','',GETDATE()-4,4);
insert into #tempTable2(argument1,argument2,argument3,argument4)
values('preacher009','',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)

3)exists对应数据的行索引

例如现在有两张表tbl_customer,tbl_phone,其中一个客户对应一个或多个电话信息,在维护电话号码时,往往会显示例如客户姓名、客户性别、修改人、修改时间等等点,查看选中的客户电话详细记录时可以查看该客户名义下的所有电话号码信息;因为是维护的客户电话号码,所以这里的修改人和修改时间应该针对的是当前客户对应的所有电话号码的最新修改时间,那么在提取这些数据时,可以使用 max() 和 exists获取这一个特别数据。

create table tbl_phone
(
  id                     number(12) not null,
  customer_id            number(12),
  phonenumber            varchar(20),
  isdeleted              char(1),
  syscreatedatetime      date,
  syscreater             number(12),
  syslastmodifytime      date,
  syslastmodifier        number(12)

)

create table tbl_customer
(
  id                     number(12) not null,
  name                   varchar(50),
  gender                 char(1),
  isdeleted              char(1),
  syscreatedatetime      date,
  syscreater             number(12),
  syslastmodifytime      date,
  syslastmodifier        number(12)

)

查询语句这样写:

select distinct c.name,

                code(c.gender, '1', '男', '0', '女', null) as gender,
                (select syslastmodifytime
                   from tbl_phone
                  where exists (select max(t.syslastmodifytime)
                           from tbl_vip_phone t
                          where t.customer_id = a.id)
                    and rownum = 1) as syslastmodifytime,
                (select syslastmodifier
                   from tbl_phone
                  where exists (select max(t.syslastmodifytime)
                           from tbl_vip_phone t
                          where t.customer_id = a.id)
                    and rownum = 1) as syslastmodifier

from tbl_customer c
  join tbl_phone p
    on c.isdeleted = 0
   and p.isdeleted = 0
   and c.id = p.customer_id

Sqlserver 中exists 和 in的更多相关文章

  1. SQLServer中exists和except用法

    一.exists 1.1 说明 EXISTS(包括 NOT EXISTS)子句的返回值是一个BOOL值.EXISTS内部有一个子查询语句(SELECT ... FROM...),我将其称为EXIST的 ...

  2. SqlServer中exists和in的区别

    1.in 2.exists

  3. Sqlserver中一直在用又经常被忽略的知识点一

    已经有快2个月没有更新博客了,实在是因为最近发生了太多的事情,辞了工作,在湘雅医院待了一个多月,然后又新换了工作...... 在平时的工作中,Sqlserver中许多知识点是经常用到的,但是有时候我们 ...

  4. (转)笔记320 SQLSERVER中的加密函数 2013-7-11

    1 --SQLSERVER中的加密函数 2013-7-11 2 ENCRYPTBYASYMKEY() --非对称密钥 3 ENCRYPTBYCERT() --证书加密 4 ENCRYPTBYKEY() ...

  5. [转]在SqlServer 中解析JSON数据

      在Sqlserver中可以直接处理Xml格式的数据,但因为项目需要所以要保存JSON格式的数据到Sqlserver中在博客:Consuming JSON Strings in SQL Server ...

  6. SQLSERVER中按年月分组

    SQLSERVER中按年月分组 一个表有三个字段id,dt,d  分别存放id,时间,数值  id    dt    d 1 2004-08-11 12:12:00.000 9  2 2005-09- ...

  7. Sqlserver中的触发器

    一 什么是触发器 1.1  触发器的概念   触发器(trigger)是SQL server来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行是由事件来触发,当对一个表进行操作(  ...

  8. 【SqlServer】解析SqlServer中的事务

    目录结构: contents structure [+] 事务是什么 控制事务 数据并发访问产生的影响 事务的隔离级别 锁 NOLOCK.HOLDLOCK.UPDLOCK 死锁分析 在这篇Blog中, ...

  9. 关于T-SQL中exists或者not exists子查询的“伪优化”的做法

    问题起源 在使用t-sql中的exists(或者not exists)子查询的时候,不知道什么时候开始,发现一小部分人存在一种“伪优化”的一些做法,并且向不明真相的群众传递这一种写法“优越性”,实在看 ...

随机推荐

  1. MySQL执行计划解读

    Explain语法 EXPLAIN SELECT …… 变体: 1. EXPLAIN EXTENDED SELECT …… 将执行计划“反编译”成SELECT语句,运行SHOW WARNINGS 可得 ...

  2. 经验总结之Android framework开发

    本人在某做手机ROM的厂商工作近两年,虽然工作年限不长,但是对此类“工种”已有比较初步的认识,写下来供大家参考借鉴. framework的工作相对于其他比较成熟的软件开发类似,分为维护和需求开发. 需 ...

  3. Windows Phone 8.1 新特性 - 控件之FlipView

    本篇为大家介绍 Windows Phone 8.1 中新增的 FlipView 控件,它的中文名字叫做:翻转视图. 虽然听起来有点拗口,但是它的用途大家一定不会陌生.在 Windows Phone 8 ...

  4. [Leetcode][JAVA] Recover Binary Search Tree (Morris Inorder Traversal)

    Two elements of a binary search tree (BST) are swapped by mistake. Recover the tree without changing ...

  5. sum() 函数

    sum()的参数是一个list 例如: sum([1,2,3])

  6. Redis主从复制深入剖析

    Redis是一个开源的,遵守BSD许可协议的key/value缓存系统,并由其高效的响应速度以及丰富的数据结构而闻名.Redis在京东的使用也是非常普遍的,包括很多关键业务上的 使用,由于Redis官 ...

  7. centos git 服务器搭建

    1.安装git sudo yum -y install git 2.创建用户与授权 # 找到 git_shell whereis git_shell /usr/bin/git-shell # 创建 g ...

  8. reactor & proactor 笔记

    1. 基本概念 1.1 同步/异步,针对应用程序和内核交互而言. 同步:进程触发IO操作等待或轮询查看IO操作是否完成: 异步:进程触发IO操作后仅需自身的处理,IO操作完成后会得到通知(异步的特点) ...

  9. Java设计模式7:适配器模式

    适配器模式 适配器模式说的是,可以把一个类的接口变换成客户端所期待的另一种接口,使得原本因接口不匹配而无法在一起工作的两个类可以一起工作. 适配器模式的用途 适配器模式的用途,在网上找了一幅图,挺形象 ...

  10. Java多线程9:ThreadLocal源码剖析

    ThreadLocal源码剖析 ThreadLocal其实比较简单,因为类里就三个public方法:set(T value).get().remove().先剖析源码清楚地知道ThreadLocal是 ...