Teradata 使用CTE语句创建表

Teradata 使用CTE语句创建表,teradata,Teradata,是否可以使用CTE语句从查询创建表? 比如: CREATE TABLE db1.test1 AS ( WITH cte1(v1) as ( SEL v1 FROM db1.table1 ) SEL * FROM cte1 ) 这就是CTE的外观: WITH employees(id, name, boss, senior_boss) AS ( SEL empls.id, empls.name, supervisors.name as boss, senior_bosses.na

是否可以使用CTE语句从查询创建表? 比如:

CREATE TABLE db1.test1 AS
(
  WITH cte1(v1) as
  ( SEL v1 FROM db1.table1 )

  SEL * FROM cte1

)
这就是CTE的外观:

WITH employees(id, name, boss, senior_boss) AS
(
SEL
empls.id,
empls.name,
supervisors.name as boss,
senior_bosses.name as senior_boss

FROM empl_cte AS empls
LEFT JOIN empl_cte AS supervisors ON empls.boss_id = supervisors.id
LEFT JOIN empl_cte AS senior_bosses ON supervisors.boss_id = senior_bosses.id
),

WITH empl_cte(....) AS
(

SEL
id, 
name
boss_id

FROM all_employees
WHERE <some_filters>
)

SEL

*

FROM products
LEFT JOIN employees ON products.sales_rep_id = employees.id
员工(身份证、姓名、老板、高级老板)为
(
选择
雇员身份证,
姓名,
作为上司,
高级上司。姓名为高级上司
从雇员处作为雇员
在empls.boss\u id=supervisors.id上将emplu\u cte作为主管左加入empls\u cte
左加入员工作为主管的高级上司。上司id=高级上司。id
),
雇员(..)为
(
选择
身份证件
名称
老板
来自所有员工
哪里
)
选择
*
来自产品
LEFT JOIN products.sales\u rep\u id=employees.id上的员工
两者

  • 将CTE转换为视图

  • employees
    转换为左侧联接中的子查询(
    employees
    作为视图)
导致大量性能损失(运行时间从几分钟增加到几天)。我不知道Teradata optimizer是如何工作的。
EXPLAIN
关于新的重构查询似乎表明
左连接将成为耗费无数时间的产品连接。

这将在V16(以及可能的早期版本)中起作用


基本上,您需要使用别名将整个查询(包括CTE)包装在SELECT中。

Afaik no。除了先创建表,然后使用…
insert into test1之外,似乎没有其他解决方法。
您能将CTE放入视图吗?如果是这样,那么您的create table语句就可以工作了。@Nick我可以,但在性能方面这是一个灾难是的,左外部联接绝对可以终止查询。是否可以使用全局临时表而不需要创建表作为select?不,我不能使用GTT,因为我使用的管道不支持这一点。
CREATE TABLE myTable AS (
    SELECT * FROM (
        WITH x AS (
            SELECT ...
            FROM  ...
            WHERE  ...
            ) 
        SELECT  ...
        FROM x ...
        WHERE  ...
        ) D
) WITH DATA PRIMARY INDEX (PK)
;