从查询创建表

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) 列。例如:

要求和限制

  • 如果从查询创建临时表,则必须指定 ON COMMIT PRESERVE ROWS 才能向该表中加载结果集。否则,Vertica 会创建一个空表。

  • 如果查询输出含有除简单列以外的表达式,例如常量或函数,则必须为该表达式指定别名,或在列名列表中列出所有列。

  • 不能将 CREATE TABLE AS SELECT 与返回复杂类型值的 SELECT 一起使用。但是,可以使用 CREATE TABLE LIKE

另请参阅