SQL DB2:声明临时表添加列

SQL DB2:声明临时表添加列,db2,alter,temporary,Db2,Alter,Temporary,我已成功声明和临时表 DECLARE GLOBAL TEMPORARY TABLE SESSION.MY_TEMP_TABLE LIKE MYTABLES.AN_EXISTING_TABLE INCLUDING IDENTITY ON COMMIT PRESERVE ROWS WITH REPLACE; 然后,我使用以下命令合并两个表并将其输出到我的临时表中: INSERT INTO SESSION.MY_TEMP_TABLE SELECT a.* FROM (SELECT * FROM MY

我已成功声明和临时表

DECLARE GLOBAL TEMPORARY TABLE SESSION.MY_TEMP_TABLE
LIKE MYTABLES.AN_EXISTING_TABLE
INCLUDING IDENTITY
ON COMMIT PRESERVE ROWS
WITH REPLACE;
然后,我使用以下命令合并两个表并将其输出到我的临时表中:

INSERT INTO SESSION.MY_TEMP_TABLE
SELECT a.*
FROM (SELECT * FROM MYTABLES.TABLE_A) as a
     LEFT JOIN
     (SELECT * FROM MYTABLES.TABLE_B) as b
ON a.KEY=b.KEY;
现在这一切都起作用了


问题:我现在想合并另一个表MYTABLES.table_C中的两个新变量,但是它不允许我合并,因为我声明了具有特定列数的临时表,并且正在尝试添加更多列。我在谷歌上做了一个搜索,似乎ALTER TABLE无法处理已声明的临时表,请提供任何帮助?

会话表DGTT需要使用所有必需的列进行声明,因为您无法使用ALTER TABLE向会话表中添加其他列

绕过此限制的一种方法是以不同的方式使用会话表,特别是根据需要创建一个新的会话表,其中包含可能还包括来自其他表的数据的任何附加列。当您使用NOT LOGGED(未记录)选项时,这可能非常快。如果您的会话表在支持该功能的环境中使用DISTRIBUTE BY HASH,它也可以正常工作

下面的示例显示了3个会话表,其中第三个表包含前两个表中的所有列:

declare global temporary table session.m1 like emp including identity on commit preserve rows with replace not logged;

declare global temporary table session.m2 like org including identity on commit preserve rows with replace not logged;

declare global temporary table session.m3 as (select * from session.m1, session.m2) with data with replace not logged;

如果您不想在声明时填充会话表,则可以仅使用定义而不使用数据,或者不使用数据,稍后通过插入或合并填充该表。

删除会话表,并使用所有必需的列重新创建它,然后重新填充它。为了更快的性能,您可能需要考虑未登录的选项。如果断开会话,会话表也将被删除。考虑使用DGTT的“替换”选项来减少表的麻烦。我应该说,在会话结束后,我想删除表,这就是为什么我使用了会话。前缀当你说“创建它将需要所有列”时,有300多列可以更改,当我可以使用“相似”选项时,我不想写出300行。@mao-是否有可能使用“相似”选项并定义一些额外的列?请换一种方式思考。基于现有会话表以及所需的任何其他表创建一个附加会话表。如果不记录,速度会更快。实例像emp一样声明全局临时表session.m1,包括提交保留行上的标识,替换未记录;声明全局临时表session.m2-like-org,包括提交保留行上的标识,替换未记录;将全局临时表session.m3声明为select*from session.m1,session.m2,其中数据为replace not logged;您也可以仅使用定义,稍后再进行合并。