Teradata宏,带有volatile表和CTE,用于将数据插入表中

Teradata宏,带有volatile表和CTE,用于将数据插入表中,teradata,Teradata,我需要创建一个teradata宏,首先将信息提取到易失性表中,然后执行CTE从该易失性表中提取数据并插入到teradata表中,尝试了不同的方法都失败了,感谢帮助 CREATE MACRO database.macro_insertion_tablename AS ( CREATE VOLATILE TABLE vt AS ( SELECT id, bu, CONCAT(TO_CHAR(comment_date, 'yyyy-mm-dd HH24:

我需要创建一个teradata宏,首先将信息提取到易失性表中,然后执行CTE从该易失性表中提取数据并插入到teradata表中,尝试了不同的方法都失败了,感谢帮助

CREATE MACRO database.macro_insertion_tablename AS (

  CREATE VOLATILE TABLE vt AS
  (
     SELECT
       id, bu,
       CONCAT(TO_CHAR(comment_date, 'yyyy-mm-dd HH24:MI:SS'), ' ', action) AS full_action,
       ROW_NUMBER() OVER (PARTITION BY id ORDER BY date DESC) AS row_num, 
       COUNT(*) OVER (PARTITION BY id) as cnt
     FROM database.table1
  ) WITH DATA UNIQUE PRIMARY INDEX(id, row_num) ON COMMIT PRESERVE ROWS; 

  WITH RECURSIVE cte (id, bu, act, rn) AS
  (
     SELECT 
       id, bu
       ,CAST(full_action AS VARCHAR(5000)) AS full_action
       ,row_num
     FROM vt
     WHERE row_num = cnt

     UNION ALL

     SELECT
       vt.id, vt.bu 
       ,cte.act || ' / ' || vt.full_action
       ,vt.row_num
     FROM vt
     JOIN cte On vt.id = cte.id AND vt.row_num = cte.rn - 1
  )  

  INSERT INTO database.table (id, bu, full_action)
  SELECT id, bu, act
  FROM cte
  WHERE rn = 1;

  DROP TABLE vt; 
); 

为了跟进我的评论,您应该能够在同一语句中定义多个CTE。让递归CTE工作起来可能很棘手,但听起来这是可能的。也许是这样的:

CREATE MACRO database.macro_insertion_tablename AS (

  WITH vt (id, bu, full_action, row_num, cnt) AS
  (
     SELECT
       id, bu,
       CONCAT(TO_CHAR(comment_date, 'yyyy-mm-dd HH24:MI:SS'), ' ', action) AS full_action,
       ROW_NUMBER() OVER (PARTITION BY id ORDER BY date DESC) AS row_num, 
       COUNT(*) OVER (PARTITION BY id) as cnt
     FROM database.table1
  ),
  RECURSIVE cte (id, bu, act, rn) AS
  (
     SELECT 
       id, bu
       ,CAST(full_action AS VARCHAR(5000)) AS full_action
       ,row_num
     FROM vt
     WHERE row_num = cnt

     UNION ALL

     SELECT
       vt.id, vt.bu 
       ,cte.act || ' / ' || vt.full_action
       ,vt.row_num
     FROM vt
     JOIN cte On vt.id = cte.id AND vt.row_num = cte.rn - 1
  )  

  INSERT INTO database.table (id, bu, full_action)
  SELECT id, bu, act
  FROM cte
  WHERE rn = 1;
);
我没有一个Teradata系统可以测试,所以它不能100%按原样工作,但请尝试一下。您可能需要将RECURSIVE更改为WITH RECURSIVE,还需要更改CTE查询的顺序,即将RECURSIVE查询放在第一位。请看以下两个链接:

DDL必须是Teradata宏中的唯一语句

作为解决方法,您可以切换到一个全局临时表,该表只定义一次,然后您只需在其中插入/选择,而不是创建VOLATILE表

但在您的情况下,不需要临时表和低效的递归处理来获得组concat:

SELECT id, max(bu) -- maybe min(bu)?
   XmlAgg(Concat(To_Char(comment_date, 'yyyy-mm-dd HH24:MI:SS'), ' ', action)
          ORDER BY comment_date)  (VARCHAR(5000)) AS full_action
FROM database.table1
GROUP BY 1

将给你一个类似的结果

你说失败是什么意思?这是一个错误还是你没有看到你所期待的?您期望得到什么结果以及当前得到什么?请记住,您定义的易失性表仅对创建它的会话可用。除了指定结果集id的分布之外,row_num是否有特殊原因需要使用易失性表?您不能在INSERT中将volatile表的结果集作为辅助CTE合并到database.table中吗。。。语句?谢谢,但不起作用,看起来宏无法插入。我将尝试SP,看看它是否有效。当您在宏外部自行运行查询时会发生什么情况?请尝试分解各个SELECT查询,看看它们是否都返回了您期望的行。尝试不工作,只选择即可,但插入到。。。选择它不起作用。谢谢。你不工作是什么意思?是否有错误或表中没有插入行?请提供尽可能多的详细信息。我计算出,对于递归表,插入teradata的正确语法是插入到带有vt as sel的表中,递归rt作为sel。。。。选择来自rt,谢谢@ravioli