SQL DB2: объявить временную таблицу, добавить столбец

#db2 #alter #temporary

#db2 #изменить #временная

Вопрос:

Я успешно объявил и временную таблицу.

 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), однако это не позволит мне, потому что я объявил временную таблицу с определенным количеством столбцов и пытаюсь добавить дополнительные столбцы. Я поискал в Google, и, похоже, ALTER TABLE не будет работать с ОБЪЯВЛЕННЫМИ ВРЕМЕННЫМИ таблицами, пожалуйста, помогите?

Комментарии:

1. Удалите таблицу сеансов и заново создайте ее со ВСЕМИ необходимыми требуемыми столбцами, затем повторно заполните ее. Возможно, вы захотите рассмотреть этот NOT LOGGED вариант для повышения производительности. Таблица сеансов также будет удалена, если вы отключите сеанс. Рассмотрите возможность использования WITH REPLACE опции для DGTT, чтобы упростить воссоздание таблицы.

2. Я должен был сказать, что хочу удалить таблицу после завершения сеанса, вот почему я использовал СЕАНС. префикс. Когда вы говорите, что для ее создания потребуются все столбцы, существует более 300 столбцов, которые могут измениться, я не хочу выписывать 300 строк, когда я мог бы использовать опцию LIKE.

3. @mao — Есть ли возможность использовать опцию LIKE и определить несколько дополнительных столбцов?

4. Подумайте по-другому. Создайте дополнительную таблицу сеансов на основе существующей таблицы сеансов, а также любых других таблиц, которые вам нужны. Намного быстрее, если NOT LOGGED . Пример. 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;

5. Вы также можете использовать definition only и выполнить слияние позже.

Ответ №1:

Таблицы сеансов (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;
  

Если вы не хотите заполнять таблицу сеансов во время объявления, вы можете использовать DEFINITION ONLY вместо WITH DATA (или использовать WITH NO DATA ) и заполнить таблицу позже с помощью insert или merge .