Exists的用法
Exists的用法
指定一个子查询,检测行的存在。
语法
EXISTS subquery
参数
subquery
是一个受限的 SELECT 语句 (不允许有 COMPUTE 子句和 INTO 关键字)。
结果类型
Boolean
结果值
如果子查询包含行,则返回 TRUE。
例子:
1.比较使用 EXISTS 和 IN 的查询
这个例子比较了两个语义类似的查询。第一个查询使用 EXISTS 而第二个查询使用 IN。注意两个查询返回相同的信息。
USE pubs
GO
SELECT DISTINCT pub_name
FROM publishers
WHERE EXISTS
(SELECT *
FROM titles
WHERE pub_id = publishers.pub_id
AND type = 'business')
GO
-- Or, using the IN clause:
USE pubs
GO
SELECT distinct pub_name
FROM publishers
WHERE pub_id IN
(SELECT pub_id
FROM titles
WHERE type = 'business')
GO
下面是任一查询的结果集:
pub_name
----------------------------------------
Algodata Infosystems
New Moon Books
(2 row(s) affected)
2.比较使用 EXISTS 和 = ANY 的查询
本示例显示查找与出版商住在同一城市中的作者的两种查询方法:第一种方法使用 = ANY,第二种方法使用 EXISTS。注意这两种方法返回相同的信息。
USE pubs
GO
SELECT au_lname, au_fname
FROM authors
WHERE exists
(SELECT *
FROM publishers
WHERE authors.city = publishers.city)
GO
-- Or, using = ANY
USE pubs
GO
SELECT au_lname, au_fname
FROM authors
WHERE city = ANY
(SELECT city
FROM publishers)
GO
下面是任一查询的结果集:
au_lname au_fname
---------------------------------------- --------------------
Carson Cheryl
Bennet Abraham
(2 row(s) affected)
3.与GROUP BY的使用
一张表,如下:
gcd intvalue strvalue
---------- ----------- ----------
1 3 abc
1 4 NULL
1 1 abd
2 7 xyz
2 30 cde
2 8 NULL
3 300 wen
4 60 NULL
要求根据GCD分组,得到intvalue的和,如果该组中存在null,则显示为false,否则为true:
select gcd,
sum(intvalue),
case when exists(select 1 from test i where i.gcd = o.gcd and strvalue is not null) then 'true' else 'false' end
from test o
group by gcd
结果:
gcd
---------- ----------- -----
1 8 true
2 45 true
3 300 true
4 60 false
(4 row(s) affected)