单行和多行子查询


子查询可以返回的行数和列数具有约束。如果您使用 INANY 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' )

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值