返回首页

gbase数据、南大通用产品文档:GBase8s集合子查询

更新日期:2024年09月11日

您可使用“集合子查询”来从子查询的结果创建 MULTISET 集合。此语法是对
SQL 的 ANSI/ISO 标准的扩展。
语法
集合子查询

元素
描述
限制
语法
singleton_select
返回正好一
行的子查询
子查询不可重复 SELECT 关键
字,也不可包括 ORDER BY 子

SELECT
语句
subquery
嵌入的查询
不可包含 ORDER BY 子句
SELECT
语句

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1255
用法
MULTISET 和 SELECT ITEM 关键字有下列重要意义:

MULTISET 指定可包括重复值的元素,但没有特定元素的顺序的集合。

SELECT ITEM 仅支持 projection 列表中的一个表达式。您不可在单个子
查询中重复 SELECT 关键字。
您可在下列上下文中使用集合子查询:

SELECT 语句的 Projection 子句和 WHERE 子句

INSERT 语句的 VALUES 子句

UPDATE 语句的 SET 子句

在您可使用集合表达式的任何地方(即,计算得到单个集合的任何表达
式)

作为传递给用户定义的例程的一个参数
下列限制适用于集合子查询:

Projection 子句不可包含重复的列(字段)名称。

它不可包含表名称的别名。(但它可使用列(字段)名称的别名,如下列
一些示例中那样。)

它是只读的。

不可打开它两次。

它不可包含 NULL 值。

它不可包含尝试在子查询内搜索的语法。
集合子查询返回未命名的 ROW 数据类型的多重集。此 ROW 类型的字段是子查
询的 projection 列表中的元素。下列示例访问表和这些语句定义的 ROW 类型:
CREATE ROW TYPE rt1 (a INT);
CREATE ROW TYPE rt2 (x int, y rt1);
CREATE TABLE tab1 (col1 rt1, col2 rt2);
CREATE TABLE tab2 OF TYPE rt1;
CREATE TABLE tab3 (a ROW(x INT));
下列结合子查询的示例返回罗列在该子查询右边的 MULTISET 集合。
集合子查询
结果集合
MULTISET (SELECT * FROM tab1)...
MULTISET(ROW(col1 rt1, col2
rt2))

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1256
MULTISET (SELECT col2.y FROM
tab1)...
MULTISET(ROW(y rt1))
MULTISET (SELECT * FROM tab2)...
MULTISET(ROW(a int))
MULTISET(SELECT p FROM tab2 p)...
MULTISET(ROW(p rt1))
MULTISET (SELECT * FROM tab3)...
MULTISET(ROW(a ROW(x int)))
下列是另一个集合子查询:
SELECT f(MULTISET(SELECT * FROM tab1 WHERE tab1.x = t.y))
FROM t WHERE t.name = 'john doe';
下列集合子查询包括 UNION 运算符:
SELECT f(MULTISET(SELECT id FROM tab1
UNION
SELECT id FROM tab2 WHERE tab2.id2 = tab3.id3)) FROM tab3;
FROM 子句中的表表达式
GBase 8s 支持在 SELECT 查询和子查询的 FROM 子句中表表达式的 ANSI/ISO
标准语法,替代 GBase 8s 扩展集合子查询语法。在 10.00 和更早的版本中需要
关键字 TABLE 和 MULTISET。支持对 SQL 的 ANSI/ISO 标准的这些扩展,
但在 SELECT 语句的 FROM 子句中不再需要集合子查询。
下列两个查询返回相同的结果集,但仅第二个查询符合 ANSI/ISO 标准:
SELECT * FROM TABLE(MULTISET(SELECT col1 FROM tab1
WHERE col1 = 100))
AS vtab(c1),
(SELECT col1 FROM tab1 WHERE col1 = 10) AS vtab1(vc1) ORDER BY c1;

SELECT * FROM (SELECT col1 FROM tab1 WHERE col1 = 100) AS
vtab(c1),
(SELECT col1 FROM tab1 WHERE col1 = 10) AS vtab1(vc1)
ORDER BY c1;
相同的 SELECT 语句可为集合子查询组合 GBase 8s 扩展与 ANSI/ISO 语法二者
的实例:
SELECT * FROM (select col1 FROM tab1 WHERE col1 = 100) AS vtab(c1),

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1257
TABLE(MULTISET(SELECT col1 FROM tab1 WHERE col1 = 10)) AS
vtab1(vc1)
ORDER BY c1;
集合子查询必须通过两种格式的圆括号定界,但紧跟在 TABLE 关键字之后并括
在 MULTISET 集合子查询规范的圆括号(( ))的外部集是对 ANSI/ISO 语法的
扩展。此 ANSI/ISO 语法仅在 SELECT 语句的 FROM 子句中是有效的。在任何
其他上下文中,您不可省略来自集合子查询规范的这些关键字和圆括号。
重要: FROM 子句中的集合子查询不可包括相关的表引用,也不可包括
LATERAL 关键字。

当您使用 DB-Access 来 更新集合类型时,您必须更新整个集合。下列语句展示如何更
新 projects 列。 要定位需要更新的行,请使用 IN 关键字在direct_reports 列上执行搜索。
UPDATE manager
SET projects = "LIST
{
ROW('brazil_project', SET{'Pryor', 'Murphy', 'Kinsley',
'Bryant'}),
ROW ('cuba_project', SET{'Forester', 'Barth', 'Lewis',
'Leonard'})
}"
WHERE 'Williams' IN direct_reports;
在前一语句中第一次出现的 SET 关键字是 UPDATE 语句语法的一部分。

GBase 8s SQL 指南:教程
南大通用数据技术股份有限公司
- 178 -
重要:
请不要将 UPDATE 语句的 SET 关键字与表明集合为 SET 数据类型的 SET 构造函数
相混淆。
虽然您可使用 IN 关键字来定位简单集合的特定元素,但您不可从 DB-Access 更新集合列
的个别元素。然而,您可创建 GBase 8s ESQL/C 程序和 SPL 例程来更新集合内的元素。要
获取关于如何创建 GBase 8s ESQL/C 程序来更新集合的信息,
请参阅
《GBase 8s ESQL/C 程
序员手册》。要获取关于如何创建 SPL 例程来更新集合的信息,请参阅 处理集合 部分。

node (192.168.146.42)
Recover table begin