可以在 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
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