子查询可以返回的行数和列数具有约束。如果您使用
IN
、
ANY
或
ALL
,则子查询可以返回多个行,但只返回一个列。如果您使用其它运算符,则子查询必须返回单个值。
示例数据库中的两个表与财务结果有关。
fin_code
表是一个较小的表,保存财务数据及其含义的不同代码:
若要列出
fin_data
表中的收入项,请键入以下语句:
SELECT *
FROM fin_data
WHERE fin_data.code IN
( SELECT fin_code.code
FROM fin_code
WHERE type = 'revenue' )
year
|
quarter
|
code
|
amount
|
1999
|
Q1
|
r1
|
1023
|
1999
|
Q2
|
r1
|
2033
|
1999
|
Q3
|
r1
|
2998
|
1999
|
Q4
|
r1
|
3014
|
2000
|
Q1
|
r1
|
3114
|
本示例使用限定符清楚地标识每个引用中的
code
列所属的表。在这个特殊示例中,限定符可能已被省略。
另外两个关键字(
ANY
和
ALL
)可以用作运算符的限定符以允许它们处理多个行。
以下查询与上面的成功查询相同:
SELECT *
FROM fin_data
WHERE fin_data.code = ANY
( SELECT fin_code.code
FROM fin_code
WHERE type = 'revenue' )
=ANY
条件与
IN
条件相同,但
ANY
还可以和不等式(如
<
或
>
)一起使用,从而更灵活地使用子查询。
ALL
关键字与单词
ANY
相似。例如,以下查询列出非收入财务数据:
SELECT *
FROM fin_data
WHERE fin_data.code <> ALL
( SELECT fin_code.code
FROM fin_code
WHERE type = 'revenue' )
这与下面使用
NOT IN
的命令等同:
SELECT *
FROM fin_data
WHERE fin_data.code NOT IN
( SELECT fin_code.code
FROM fin_code
WHERE type = 'revenue' )
通常,子查询结果集限制为单个列。以下示例没有意义,这是因为
Adaptive Server Anywhere
不知道将
fin_code
中的哪个列与
fin_data.code
列比较。
-- this query is incorrect
SELECT *
FROM fin_data
WHERE fin_data.code IN
( SELECT fin_code.code, fin_code.type
FROM fin_code
WHERE type = 'revenue' )
使用
IN
条件的子查询可以返回一组行,而使用比较运算符的子查询则只能返回一行。例如,由于子查询返回两行,所以以下命令导致一个错误:
-- this query is incorrect
SELECT *
FROM fin_data
WHERE fin_data.code =
( SELECT fin_code.code
FROM fin_code
WHERE type = 'revenue' )