DB2中与T-SQL临时表相当的是什么?

12

我该如何在DB2中执行以下TSQL查询?我在根据查询结果创建临时表时遇到问题。

SELECT 
COLUMN_1, COLUMN_2, COLUMN_3
INTO #TEMP_A
FROM TABLE_A
WHERE COLUMN_1 = 1 AND COLUMN_2 = 2

错误信息如下:

"错误:SQL0104N 发现意外的标记“#TEMP_A”在“”后面。期望的标记可能包括:“:”。SQLSTATE = 42601"


如果我在DB2中运行错误,我会得到以下错误信息:“错误:SQL0104N发现意外的标记“#TEMP_A”后面是“”。预期的标记可能包括:“:”。SQLSTATE = 42601”。 - I_AM_JARROD
事实证明,我没有权限创建临时表。 - I_AM_JARROD
3个回答

18

在使用DB2之前,您必须先声明一个临时表。可以使用运行相同查询的方式来声明该表:

DECLARE GLOBAL TEMPORARY TABLE SESSION.YOUR_TEMP_TABLE_NAME AS (
    SELECT COLUMN_1, COLUMN_2, COLUMN_3
    FROM TABLE_A
) DEFINITION ONLY
或者“手动”定义列:
DECLARE GLOBAL TEMPORARY TABLE SESSION.YOUR_TEMP_TABLE_NAME (
     COLUMN_1 CHAR(10)
    ,COLUMN_2 TIMESTAMP
    ,COLUMN_3 INTEGER
) 

然后填充它:

INSERT INTO SESSION.YOUR_TEMP_TABLE_NAME
SELECT COLUMN_1, COLUMN_2, COLUMN_3
FROM TABLE_A
WHERE COLUMN_1 = 1
  AND COLUMN_2 = 2

这并不像在SQL Server中那样直截了当。 :)

虽然被称为“全局”临时表,但它只存在于当前会话中。请注意,所有临时表都应以SESSION模式为前缀。如果您未提供模式名称,则将隐含使用SESSION


3
一条小提示:你可能想要在“on commit delete rows”默认设置的基础上加上“on commit preserve rows”,因为那种行为可能不是理想的。 - Richard Morgan
1
@RichardMorgan 或者让所有内容在同一个事务中运行。 - bhamby
第一段代码只是定义表还是填充它?为什么在定义中有从table_a选择的语句? - JSideris
1
@Bizorke 第一条语句中的 SELECT 仅获取这些列的定义,并使用相同的名称、数据类型等在临时表中创建列。在我看来,IBM 有点缺乏远见,不允许您同时定义和填充临时表。 - bhamby
1
@Hogan 他确实说过他想要一个基于你正在运行的查询的临时表。然而,我已经编辑了如何“手动”完成它的步骤。 - bhamby
显示剩余2条评论

4
也许你需要的是“with”子句:
with TEMP_A as (
  SELECT COLUMN_1, COLUMN_2, COLUMN_3
  FROM TABLE_A
  WHERE COLUMN_1 = 1 AND COLUMN_2 = 2
)
-- now use TEMP_A
select * from TEMP_A

7
需要翻译的内容:Maybe make it clear this is a CTE and not a temporary table.可能需要明确这是一个公共表达式(CTE),而不是临时表。 - eaglei22

-6

事实证明,我没有创建临时表的权限。


有趣的是,这被接受为答案,但实际上并没有回答问题。 - Hogan
嗯,这是对提问者所面临问题的一个特定答案(回答者就是提问者),但从一般意义上讲并不是特别有帮助。 :) - bhamby
@bhamby -- 这个问题是谷歌搜索中的热门问题之一。你认为那些人会想要哪一个回答,你的还是这个? - Hogan
2
@Hogan 可能是我的答案:)。但是采纳的答案只能由提问者更改,所以除非他们回来更改,否则没有太多可做的。从帮助页面中可以得知:“接受答案并不意味着对于问题有了最终和确定性的解决方案。这仅仅意味着作者收到了一个对他们个人有效的答案。并不是每个用户都会回来接受答案,即使有一些用户会回来接受答案,他们也可能不会更改已经接受的答案,即使后来出现了更新更好的答案。” - bhamby
@Hogan,此外,这也是一个可能有用的提醒,先检查您的权限,然后再尝试临时表实验,以免浪费时间。 - pstraton

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接