EXISTS 作用是判断某个对象是否存在,常用于判断表或在WHERE子句等条件中使用,分别介绍如下:
1,可以判断某个表或某对象是否存在
if exists(select * from sys.tables where name = 'xTable')
print '表 xTable 存在'
else
print '表 xTable 不存在'
go
2, exists 在WHERE子句中使用
注意在 WHERE 子句中 EXISTS 之前没有关联字段,可以同时还有其它的条件,如:
...WHERE EXISTS(...) 或 WHERE c1 = v1 AND [ c2 > v2 AND...] AND EXISTS ( ... )
一个例子:
一个表记录会议的相关内容,一个表记录参与对应会议的人员表,量表通过会议ID进行关联,先要求查处某个用户某个时间段内参与过的所有会议记录查出来;
--会议信息记录表
create table meeting(
[refid] int identity(1,1) not null, --记录ID
[promoterId] varchar(50) not null, --会议发起者
[meetingURL] varchar(50) not null, --会议ID
[beginTime] datetime null default getdate(), --会议起始时间
[endTime] datetime null, --会议结束时间
[endType] varchar(1) default '0' --会议结束类型,0=正常结束,1=超时退出,2=网络中断退出
primary key([refid])
)
--会议参与人员表
create table meetingUser(
[refid] int identity(1,1) not null, --记录ID
[meetingId] varchar(50) not null, -- = meeting.refid
[userId] varchar(50) not null, --参与会议的人员ID
[addTime] datetime null default getdate(), --加入会议时间
primary key([refid])
)
现在要查询某个用户某个时间段所有参与过的会议记录信息,分析:
通过 meetingUser 表查找该用户所有参与过的会议ID,然后再根据得到的会议ID,在 meeting 表中查找相关记录,这可以用 in 关键字,但 in 的个数有限制[Oracle是0 ~ 1000,SQL SERVER的范围忘了],在有限范围内是可以的,但是超出部分就不可以了;所以最好的方法是用 exists 关键字,不受范围限制,此外在加个时间范围即可;
--有限范围的 in 用法
select * from meeting
where beginTime >= '2012-06-12' and beginTime <= '2013-02-01'
and refid in (select meetingId from meetingUser where userId = 'xxUserId')
--exists 用法[推荐]
select * from meeting
where beginTime >= '2012-06-12' and beginTime <= '2013-02-01'
and exists (select * from meetingUser where userId = 'xxUserId')
注意: 与之相关的是 IN 关键字,但 IN 需要与某字段关联, 如:
...WHERE c1 in (...) 或 WHERE c1 in (...) AND c2 = v2 [ AND c3 = v3 ... ]