可以在 teradata 中使用临时表吗

can one use temp tables in teradata

teradata 中的 sql 服务器 tsql 是否有等效项:

IF OBJECT_ID('tempdb..#SomeTempTable') IS NOT NULL DROP TABLE #SomeTempTable;

CREATE TABLE #SomeTempTable (Bla NVARCHAR(255));

INSERT INTO #SomeTempTable
SELECT N'a'
    UNION ALL
SELECT N'B'

第一个语句没有等效项,可能有一个存储过程,如下所示:

REPLACE PROCEDURE Drop_Table_If_Exists
(
  IN db_name VARCHAR(128) CHARACTER SET UNICODE,
  IN tbl_name VARCHAR(128) CHARACTER SET UNICODE,
  OUT msg VARCHAR(400) CHARACTER SET UNICODE
) SQL SECURITY INVOKER
BEGIN
   DECLARE full_name VARCHAR(361)  CHARACTER SET UNICODE;

   DECLARE sql_stmt VARCHAR(500)  CHARACTER SET UNICODE;
   DECLARE exit HANDLER FOR SQLCODE 'T3807'--SQLEXCEPTION
   BEGIN
      IF SQLCODE = 3807 THEN SET msg = full_name || ' doesn''t exist.';
      ELSE
        RESIGNAL;
      END if;
   END;

   SET full_name = '"' || COALESCE(db_name,DATABASE) || '"."' || tbl_name || '"';

   SET sql_stmt = 'DROP TABLE ' || full_name || ';';
   EXECUTE IMMEDIATE sql_stmt;

   SET msg = full_name || ' dropped.';
END;

A VOLATILE table 仅存在于您当前的会话中(即相同的名称可能在不同的会话中用于不同的 table),并且在会话断开连接时自动删除.当您保持命名约定(临时名称以 # 开头)时,您可能不需要条件删除(您应该知道您是否已经在当前会话中创建了这个 table):

CREATE VOLATILE TABLE #SomeTempTable( 
Bla VARCHAR(255) CHARACTER SET UNICODE)
ON COMMIT PRESERVE ROWS;

注意,如果您不指定主索引,它将默认为第一列上的 NUPI。

Select 有一个奇怪的限制,当你像UNION/INTERSECT/EXCEPT 这样的集合操作时,你需要一个FROM。解决方法是像这样的虚拟视图(类似于 Oracle 的 DUAL table):

replace view dummy as select 1 as x;

INSERT INTO #SomeTempTable
SELECT 'a' FROM dummy
    UNION ALL
SELECT 'B' FROM dummy

或类似的 CTE:

INSERT INTO #SomeTempTable
WITH dummy AS (select 1 as x)
SELECT 'a' FROM dummy
    UNION ALL
SELECT 'B' FROM dummy