表表达式

表表达式在FROM子句的SELECT子句中定义数据源或作为TABLE子句的参数。

语法图

selectOpt
table_name@index_namefunc_applicationselect_stmtjoined_tableWITHORDINALITYAStable_alias_namename

参数介绍

参数说明
table_name表或视图名称。
table_alias_name在别名表表达式中使用的名称。
name列名的一个或多个别名,用于别名表表达式。
index_name强制索引选择的可选语法。
func_application函数的结果。
row_source_extension_stmt受支持语句的结果行。
select_stmt用作子查询的选择查询。
joined_table一个连接表达式。

生成数据的表表达式

表和视图名称

语法

identifier
identifier.identifier
identifier.identifier.identifier

表表达式中的单个SQL标识符指定当前数据库中具有该名称的表、视图或序列的内容。

如果名称由两个或多个标识符组成,则应用名称解析规则。

例如:

select * from cust; -- uses table `cust` in the current database
select * from ora.cust; -- uses table `cust` in database `ora`

强制索引选择

强制索引扫描

强制扫描特定索引的语法是:

select * from table@my_idx;

例如:

select * from cust_info@cust_info_cust_card_no_idx;

强制部分索引扫描

要强制进行部分索引扫描,您的语句必须有一个WHERE子句。

create table te (
  t INT,
  index idx (t) where t > 1);
  
insert into te(t) values (3);

select * from te@idx where t > 1;

强制部分GIN索引扫描

要强制进行部分GIN索引扫描,语句必须有一个WHERE子句:

  • 隐含部分索引。
  • 约束 GIN索引扫描。
create table tee (
  j JSON,
  INVERTED INDEX idx (j) WHERE j->'a' = '1');
  
insert into tee(j)
  values ('{"a": 1}'),
         ('{"a": 3, "b": 2}'),
         ('{"a": 1, "b": 2}');
select * from tee@idx WHERE j->'a' = '1' AND j->'b' = '2';
        j
--------------------
  {"a": 1, "b": 2}

访问公用表表达式

表表达式中的单个标识符可以引用前面定义的公用表表达式

例如:

with m as (select * from cust)
  select * from m;

函数的结果

表表达式可以将函数应用程序的结果用作数据源。

函数名的解析遵循与表名解析相同的规则。有关详细信息,请参阅名称解析

标量函数作为数据源

当返回单个值的函数用作表表达式时,它被解释为包含函数结果的单列和单行的表格数据。

例如:

select * from sin(2.6);
         sin
----------------------
  0.5155013718214642

表生成器函数

一些函数直接从单个函数应用程序生成具有多行的表格数据。这也称为集合返回函数(SRF)。

例如:

select * from generate_series(2,4);
+-----------------+
| generate_series |
+-----------------+
|               2 |
|               3 |
|               4 |
+-----------------+

扩展表表达式的运算符

别名表表达式

别名表表达式在当前查询的上下文中临时重命名表和列。

语法:

<table expr> AS <name>
<table expr> AS <name>(<colname>, <colname>, ...)

在第一种形式中,表表达式等价于它的左操作数,为整个表使用了一个新名称,其中的列保留了它们的原始名称。

在第二种形式中,列也被重命名。

例如:

select c.x from (select count(*) as x from cust_info) as c;
select c.x from (select count(*) from cust_info) as c(x);

序数注释

将名为 的列附加ordinality到表表达式操作数中指定的数据源,其值描述每行的序数。

语法:

<table expr> WITH ORDINALITY

例如:

select * from  (values('b'),('d'),('f')) ;
+---------+
| column1 |
+---------+
| b       |
| d       |
| f       |
+---------+
select * from  (values('b'),('d'),('f')) WITH ORDINALITY;
  column1 | ordinality
----------+-------------
  b       |          1
  d       |          2
  f       |          3

使用另一个查询作为表表达式

使用子查询

可以将括号内的选择查询用作表表达式,这称为子查询。

例如:

select c+2 from (select COUNT(*) AS c from cust_info);
select * from (values(1), (2), (3));
select ename || ' ' || empno from (TABLE emp);

使用另一个语句的输出

语法:

with table_expr as ( <stmt> ) select .. from table_expr

WITH查询将执行语句的输出指定为行源。支持以下语句作为表表达式的行源:

  • DELETE
  • EXPLAIN
  • INSERT
  • SELECT
  • SHOW
  • UPDATE
  • UPSERT

例如:

WITH a AS (SHOW COLUMNS from cust) SELECT "column_name" FROM a;
 column_name
---------------
  cardno
  name
  email
  age
  sal
  rowid

可组合性

可以在SELECT子句和TABLE子句中使用表表达式。因此,它们可以出现在任何可能出现选择子句的地方。例如:

SELECT ... FROM <table expr>, <table expr>, ...
TABLE <table expr>
INSERT INTO ... SELECT ... FROM <table expr>, <table expr>, ...
INSERT INTO ... TABLE <table expr>
CREATE TABLE ... AS SELECT ... FROM <table expr>, <table expr>, ...
UPSERT INTO ... SELECT ... FROM <table expr>, <table expr>, ...