表表达式(有时称为派生的表)是表或视图的名称,或对一系列行求值的规范。这些行通常是嵌入到嵌套的 SELECT 语句中,或一些其他 SQL 语句中的查询的结果。
简单的表表达式是在保持查询结果的正确性时,其基础查询可包含进主查询内的表达式。
复合的表表达式是在保持查询结果的正确性时,其基础查询不可包含进主查询内的表达式。数据库服务器将这样的表表达式具体化成在主查询中使用的临时表。在 FROM 子句中指定聚集、集合操作符或 ORDER BY 子句的子查询作为复合的表表达式实现,通常需要比简单的表表达式更多的数据库服务器资源。
在两种情况下,该表表达式作为常规的 SQL 查询求值,且它的结果可被认为是逻辑表。此逻辑表及其列可就如普通的基础表那样使用,但它不是持久的。它仅在引用它的查询的执行期间存在。
表表达式与常规的 SELECT 语句有相同的语法,但有在其他上下文中适用于子查询的大部分限制。表表达式不可包括显式地创建结果表的 SELECT INTO 子句。
GBase 8s 不支持“通用化的键”索引。它支持在 CREATE TRIGGER 语句的触发器活动中的表表达式,并作为 Select 触发器的触发事件。 GBase 8s 还支持表表达式中的 ORDER BY 子句。
GBase 8s 支持迭代器函数作为 FROM 子句表标识符。然而,SPL 的 CALL 语句不可在 FROM 子句中的子查询内调用迭代器 TABLE 函数。
除了这些限制之外,任何有效的 SQL 查询都可为表表达式。表表达式可嵌套在另一表表达式之内,且可在它的定义中包括表和视图。您可在 CREATE VIEW 语句中使用表表达式来定义视图。
相关的子查询是引用未罗列在其 FROM 子句中的表的列的子查询。相反,仅引用罗列在其 FROM 子句中的表中的列的子查询是不相关的子查询。
SELECT * FROM (SELECT * FROM t1 WHERE a IN (SELECT b FROM t2 WHERE t1.a = t2.b));此处,在第一个 WHERE 子句中的子查询是相关的子查询,因为它引用表 t1 的列 a,但它的 FROM 子句仅指定表 t2。
在 FROM 子句表表达式中,GBase 8s 还支持 ORDER BY 子句,这在 FROM 子句之外的子查询中不是有效的。在表表达式中通过 ORDER BY 子句指定的列或表达式不需要包括在 Projection 子句中。