从查询创建表
CREATE TABLE 可以指定 AS 子句以从查询创建表,如下所示:
CREATE [TEMPORARY] TABLE [schema.]table-name
[ ( column-name-list ) ]
[ {INCLUDE | EXCLUDE} [SCHEMA] PRIVILEGES ]
AS [ /*+ LABEL */ ] [ AT epoch ] query [ ENCODED BY column‑ref‑list ]
Vertica 会从查询结果创建一个表,并向其中加载结果集。例如:
=> CREATE TABLE cust_basic_profile AS SELECT
customer_key, customer_gender, customer_age, marital_status, annual_income, occupation
FROM customer_dimension WHERE customer_age>18 AND customer_gender !='';
CREATE TABLE
=> SELECT customer_age, annual_income, occupation FROM cust_basic_profile
WHERE customer_age > 23 ORDER BY customer_age;
customer_age | annual_income | occupation
--------------+---------------+--------------------
24 | 469210 | Hairdresser
24 | 140833 | Butler
24 | 558867 | Lumberjack
24 | 529117 | Mechanic
24 | 322062 | Acrobat
24 | 213734 | Writer
...
AS 子句选项
可以使用以下一个或两个选项来限定 AS 子句:
-
LABEL 提示,标识用于分析和调试的语句
-
AT epoch 子句,用于指定查询返回历史数据
标记 AS 子句
可以在 AS 子句中的两个位置嵌入 LABEL 提示:
-
紧跟在关键字 AS 之后:
CREATE TABLE myTable AS /*+LABEL myLabel*/...
-
在 SELECT 语句中:
CREATE TABLE myTable AS SELECT /*+LABEL myLabel*/
如果 AS 子句在两个位置均包含 LABEL 提示,则第一个标签具有优先权。
注意
标签对外部表无效。加载历史数据
可以使用 AT epoch 子句限定 CREATE TABLE AS 查询,以指定查询返回历史数据,其中 epoch 是以下值之一:
-
EPOCH LATEST:返回数据直到当前时期(但不包括当前时期)。结果集包括来自最新提交的 DML 事务的数据。
-
EPOCH integer:返回数据直到 integer 指定的时期(包括该指定时期)。
-
TIME 'timestamp':从 timestamp 指定的时期返回数据。
注意
这些选项用于查询临时表或外部表。有关 Vertica 如何使用时期的详细信息,请参阅时期。
有关详细信息,请参阅历史查询。
零宽度列处理
如果查询返回零宽度列,Vertica 会自动将其转换为 VARCHAR(80) 列。例如:
注意
=> CREATE TABLE example AS SELECT '' AS X;
CREATE TABLE
=> SELECT EXPORT_TABLES ('', 'example');
EXPORT_TABLES
----------------------------------------------------------
CREATE TEMPORARY TABLE public.example
(
X varchar(80)
);
要求和限制
-
如果从查询创建临时表,则必须指定 ON COMMIT PRESERVE ROWS 才能向该表中加载结果集。否则,Vertica 会创建一个空表。
-
如果查询输出含有除简单列以外的表达式,例如常量或函数,则必须为该表达式指定别名,或在列名列表中列出所有列。
-
不能将 CREATE TABLE AS SELECT 与返回复杂类型值的 SELECT 一起使用。但是,可以使用 CREATE TABLE LIKE。