暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

GBase 8s SQL 指南:教程_6 编写高级 SELECT 语句 (9) 处理 SELECT 语句中的集合

GBASE数据库 2021-12-31
362

数据库服务器提供了下列 SQL 功能来处理集合表达式:

集合子查询

集合子查询采用虚拟表(子查询的结果)并将它转换为集合。 

集合子查询总是返回类型 MULTISET 的集合。可使用集合子查询将关系数据库的查 询结果转换为 MULTISET 集合。

集合派生的表

集合派生的表采用集合并将它转换为虚拟表。 

将集合的每个元素构造成集合派生的表中的行。可以使用集合派生的表来访问集合的 个别元素。 

集合子查询和集合派生的表功能表示逆操作:集合子查询将关系表的行为转换为集合,而集合派生的表将集合的元素转换为关系表的行。

集合子查询

集合子查询使用户能够从子查询表达式构造集合表达式。集合子查询在紧邻子查询之前使 用 MULTISET 关键字以将返回的值转换为 MULTISET 集合。但是,当在子查询表达式 之前使用 MULTISET 关键字时,数据库服务器不会更改基础表的各行而只会修改这些行的副本。例如,如果将集合子查询传递至修改集合的用户定义的例程,那么会修改集合的 副本而不会修改基础表。 

集合子查询是可采用下列任何形式的表达式:

• MULTISET(SELECT expression1, expression2... FROM tab_name...) 

• MULTISET(SELECT ITEM expression FROM tab_name...)

在集合子查询中省略 ITEM 关键字

如果在集合子查询表达式中省略 ITEM 关键字,那么集合子查询就是其元素类型始终为未 命名的 ROW 类型的 MULTISET。未命名 ROW 类型的字段与在子查询的 Projection 子句中指定的表达式的数据类型相匹配。 假设您创建了包含类型为 MULTISET 的列的以下表:


下列查询显示如何在 WHERE 子句中使用集合子查询来将子查询返回的 INT 值的行转换 为类型为 MULTISET 的集合。在此示例中,数据库服务器在tab2 的 ms_col 列等于集合子 查询表达式的结果时返回行。

图: 查询


该查询在集合子查询中省略了 ITEM 关键字,因此子查询返回的 INT 值类型为 MULTISET(ROW(a INT) NOT NULL)(它与 tab2 的 ms_col 列的数据类型相匹配)。

在集合子查询中指定 ITEM 关键字

当子查询的投影列表包含单个表达式时, 可以用 ITEM 关键字作为子查询的投影列表的 开始以指定 MULTISET 的元素类型与子查询结果的数据类型相匹配。换言之,当包括 ITEM 关键字时,数据库服务器不在投影列表两端放置行包装器。例如:如果子查询(紧跟在 MULTISET 关键字之后)返回 INT 值,集合子查询具有类型 MULTISET(INT NOT NULL)。

假设您创建接受类型为 MULTISET(INT NOT NULL)的参数的函数 int_func()。下列查询 显示将具有 INT 值的行转换为 MULTISET 并将集合子查询用作函数 int_func() 中的参数 的集合子查询。

图: 查询


该查询在子查询中包括 ITEM 关键字,因此将查询返回的 int_col 值转换为类型为 MULTISET(INT NOT NULL)的集合。没有 ITEM 关键字,集合子查询将返回类型为 MULTISET(ROW(a INT) NOT NULL)的集合。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论