DB2 CTAS 令牌错误

Posted

技术标签:

【中文标题】DB2 CTAS 令牌错误【英文标题】:DB2 CTAS Token Error 【发布时间】:2016-11-10 00:15:24 【问题描述】:

我正在尝试在 DB2 版本 11.1.0 中使用 CTAS 语句来创建一个新表并插入它。查询如下:

      CREATE TABLE MY_SCRATCH.LC$U7OB81478732948714_zero_to_3 AS (
      WITH two AS (SELECT id AS the_num FROM users WHERE id = 2)
        ,  one_two AS (
        SELECT id AS the_num FROM users WHERE id = 1
        UNION ALL
        SELECT * FROM two tmp
      )
        ,  zero_one_two AS (
        SELECT id-7 AS the_num FROM users where id = 7
        UNION ALL
        SELECT * FROM one_two tmp

      )
        SELECT * FROM zero_one_two tmp
        UNION ALL
        SELECT id AS the_num FROM users WHERE id = 3
      ) WITH DATA

但是,我收到以下错误:

"my_error":"SQL 错误:derived_table zero_to_3 创建失败:CREATE TABLE 中的 SQL 错误为 SELECT:com.ibm.db2.jcc.am.SqlSyntaxErrorException:DB2 SQL 错误:SQLCODE=-104,SQLSTATE=42601,SQLERRMC =AS;RO_TO_3\" (\nWITH TWO;JOIN, DRIVER=4.16.53"

根据DB2 docs,报错原因如下:

在 SQL 语句中出现符号“token”的地方检测到语法错误。如果语句的前面部分完全正确,则可能合法的符号列表显示了一些可能在此时正确的替代符号。

所以我在 RazorSQL 中运行了上述查询,它抛出了同样的错误。不太确定令牌问题在哪里

【问题讨论】:

包含列名的预期表结构是什么? 【参考方案1】:

您不能使用公用表表达式。如果您查看CREATE TABLE 的语法(下图针对您的具体问题进行了删节):

>>-CREATE TABLE--table-name------------------------------------->

>--+-----------------------+--AS--(--fullselect--)-------------->
   |    .-,-----------.    |                         
   |    V             |    |                         
   '-(----column-name-+--)-'                         

>--+-WITH NO DATA-+---------------------------------------------|
   '-WITH DATA----'   

fullselect 是完整选择查询的一部分,但它不包括公用表表达式。公共表表达式是select-statement 的一部分。

也许可以使用嵌套表表达式而不是公用表表达式来重写您的查询,但是您的示例查询很难说明这一点,因为您甚至根本不需要公用表表达式。您的查询可以用更简单的方式编写为:

CREATE TABLE MY_SCRATCH.LC$U7OB81478732948714_zero_to_3 AS (
    select id as the_num from users where id = 2
    union all
    select id as the_num from users where id = 1
    union all
    select id-7 as the_num from users where id = 7
    union all
    select id as the_num from users where id = 3
)
   WITH DATA;

【讨论】:

我最终没有使用你的代码,因为我在我的系统中发现了一个标志,允许我在 CTAS 中关闭对 CTE 的支持,从而解决了这个问题

以上是关于DB2 CTAS 令牌错误的主要内容,如果未能解决你的问题,请参考以下文章

DB2 MERGE 语句错误

CTAS COPY INTO 的输出

雪花存储过程 - 如何检索 CTAS 语句创建的行数

SQL0104 令牌 Col_Name 无效

4200 - SQL0104 - 令牌无效

使用内部联接删除 DB2