【问题标题】:Creating stored procedure with multiple temp tables使用多个临时表创建存储过程
【发布时间】:2018-03-16 02:09:45
【问题描述】:

因此,我创建了一个报表,该报表本质上是运行由多个易失性表构建的 DML 语句。我构建它的方式是,我的每个临时表基本上都是从先前的表中派生出来的。例如,在我的第一个表中,我定义了“数据集”,而我的其他临时表定义了我的“排除项”,然后我的最后几个临时表将它们全部组合起来,然后在最终查询中执行它。

我想自动生成此报告以每天提取数据,但我不确定是为其创建宏还是 sp。这两种方法的更大问题是,我如何才能有效地利用每个临时表?我曾考虑将我的所有表格组合成一个 GIANT(1000 多行)DML 语句,但肯定有更好、更简单的选择。

非常感谢任何帮助,谢谢!

【问题讨论】:

  • 既然您提到了每日数据拉取,您可能不需要临时表。您也许可以使用临时表。这些是不属于规范化或星型模式的普通数据库表。他们的目的是帮助 ETL 过程的 T 部分。您只需替换临时表的内容,而不是一直创建临时表。
  • 另一种选择是使用全局临时表。这些在访问时被实例化,是会话本地的,并在用户 TEMP 空间而不是 SPOOL 中实现。表定义保留在数据字典中,因此您不必将它们嵌入到整体 SQL 中来构建报表。

标签: sql stored-procedures macros teradata temp-tables


【解决方案1】:

您也可以使用Common Table Expression (CTE) 代替临时表:

WITH cte1 AS
( 
    SELECT *
    FROM table_1
    WHERE
), cte2 AS
(
    SELECT...
    FROM cte2 
    JOIN ...
    WHERE
)
...
SELECT *
FROM cte_n;

一个 CTE 可以依赖于前一个,也可以使用递归并在最终查询中组合结果。

【讨论】:

  • 经过多次测试,我发现CTE是最适用的。但是,从它创建视图时,我不确定语法是什么,代码如下:CREATE RECURSIVE VIEW db.Test_View AS WITH CTE 3 AS (SELECT FROM CTE 2), CTE 2 AS (SELECT FROM CTE 1 JOIN .. . WHERE ... ), CTE 1 AS ( SELECT FROM ... JOIN ON ... WHERE ... ) SELECT * FROM CTE3
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-12
  • 2011-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多