powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Один запрос из многих таблиц
13 сообщений из 13, страница 1 из 1
Один запрос из многих таблиц
    #36961017
aquaman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DB2 9.5
Имеются N таблиц с полем "WRITETIME". Как получить выборку по максимальному значению этого поля из всех таблиц, где это поле встречается? Примечание: некоторые имена таблиц заключены в двойные кавычки.

Я себе примерно представляю такой алгоритм:
1. Получить все имена таблиц с полем "WRITETIME"
2. Заполнить массив
3. Циклически обработать массив, складывая полученные выборки по очередной таблице вместе

Вопрос: как это реализовать в DB2 или может есть способ проще?
...
Рейтинг: 0 / 0
Один запрос из многих таблиц
    #36961116
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
aquaman,

Предположим, что вы нашли этот макс. значение в WRITETIME.
Какую именно выборку вы хотите получить из этих таблиц по полученному значению?
...
Рейтинг: 0 / 0
Один запрос из многих таблиц
    #36961177
aquaman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Mark Barinstein,

что-то вроде этого:

Название таблицы; max(WRITETIME)
...
...
Рейтинг: 0 / 0
Один запрос из многих таблиц
    #36961212
aquaman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
UNION ALL тут использовать не могу, т.к. кол-во таблиц меняется. Да и слишком громоздко получится в любом случае.
М.б. есть более изящный вариант?
...
Рейтинг: 0 / 0
Один запрос из многих таблиц
    #36961262
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
aquaman,

Динамически текст запроса вы можете получить таким селектом:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
with a(tab, rn) as (
select rtrim(t.tabschema)||'.'||t.tabname tab, rownumber() over() rn
from syscat.tables t
join syscat.columns c on t.tabschema=c.tabschema and t.tabname=c.tabname
where c.colname='WRITETIME' and t.type='T'
)
, b(stmt, rn) as (
select cast('select '''||tab||''', max(WRITETIME) from '||tab as clob(32k)), rn from a where rn= 1 
  union all
select b.stmt||' union all select '''||tab||''', max(WRITETIME) from '||a.tab, a.rn from a, b where a.rn=b.rn+ 1 
)
select 'select * from ('||stmt||') t(tab, WRITETIME)' from b where rn=(select max(rn) from a)
и потом вернуть курсор.

Если у вас таких таблиц десятки, то, может быть, лучше будет использовать цикл на основе запроса в with, где при каждой итерации вы будете динамически генерировать и выполнять запрос типа:
Код: plaintext
insert into session.t (tabname, writetime) select 'tab', max(writetime) from tab
А в конце вам надо будет сделать селект из session.t, чтобы вернуть результат.
...
Рейтинг: 0 / 0
Один запрос из многих таблиц
    #36961472
aquaman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Mark Barinstein,

2й вариант, имхо, удобнее.
Теперь, как я понимаю, нужно создать хп и циклически (Используя FOR?) обработать все таблицы, складывая результаты во временную таблицу.. А потом вывести ее содержимое. Щас буду пробовать..

Спасибо, Марк! :)
...
Рейтинг: 0 / 0
Один запрос из многих таблиц
    #36962417
aquaman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Mark Barinsteinaquaman,
Если у вас таких таблиц десятки, то, может быть, лучше будет использовать цикл на основе запроса в with, где при каждой итерации вы будете динамически генерировать и выполнять запрос типа:
Код: plaintext
insert into session.t (tabname, writetime) select 'tab', max(writetime) from tab
А в конце вам надо будет сделать селект из session.t, чтобы вернуть результат.

А можете привести примерно код, как это будет выглядеть?
Спасибо!
...
Рейтинг: 0 / 0
Один запрос из многих таблиц
    #36962474
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
create procedure get_max()
dynamic result sets  1 
begin
  declare stmt varchar( 4000 );
  declare c1 cursor with return for s1;

  set stmt = 
    'declare global temporary table session.t(TAB varchar(128) not null, WRITETIME timestamp) '
  ||'with replace not logged';
  execute immediate stmt;

  for v as 
    select rtrim(t.tabschema)||'.'||t.tabname tab
    from syscat.tables t
    join syscat.columns c on t.tabschema=c.tabschema and t.tabname=c.tabname
    where c.colname='WRITETIME' and t.type='T'
  do
     set stmt = 'insert into session.t select '''||v.tab||''', max(WRITETIME) from '||tab;
     execute immediate stmt;
  end for;

  set stmt='select * from session.t';
  prepare s1 from stmt;
  open c1;
end@
...
Рейтинг: 0 / 0
Один запрос из многих таблиц
    #36963159
aquaman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Mark Barinstein,
спасибо за код. :) Все почти работает! Но...

Возникла еще одна проблема.. :( Не зря я указал в начале треда, что некоторые имена таблиц заключены в двойные кавычки. А запрос имен из таблицы syscat.tables возаращает имена таблиц без кавычек. И, как следствие, появляется ошибки вида:

call get_max
SQL0204N "ITMUSER.KLZ_DISK" is an undefined name. SQLSTATE=42704

SQL0204N "ITMUSER.KLZ_DISK " is an undefined name.

Есть идеи как с этим бороться?
...
Рейтинг: 0 / 0
Один запрос из многих таблиц
    #36963172
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
aquamanВозникла еще одна проблема.. :( Не зря я указал в начале треда, что некоторые имена таблиц заключены в двойные кавычки. А запрос имен из таблицы syscat.tables возаращает имена таблиц без кавычек. И, как следствие, появляется ошибки вида:

call get_max
SQL0204N "ITMUSER.KLZ_DISK" is an undefined name. SQLSTATE=42704

SQL0204N "ITMUSER.KLZ_DISK " is an undefined name.

Есть идеи как с этим бороться?
Код: plaintext
1.
select rtrim(t.tabschema)||'.'||t.tabname tab
select '"'||rtrim(t.tabschema)||'"."'||t.tabname||'"' tab
...
Рейтинг: 0 / 0
Один запрос из многих таблиц
    #36963184
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну а если у вас встретятся ещё бОльшие извращения в виде двойных кавычек в именах схемы или таблицы, то надо будет:

Код: plaintext
select '"'||replace(rtrim(t.tabschema), '"', '""')||'"."'||replace(t.tabname, '"', '""')||'"' tab
...
Рейтинг: 0 / 0
Один запрос из многих таблиц
    #36963380
aquaman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Mark Barinstein,

Провел тест: таблицы без кавычек прекрасно видятся даже если их имена заключить в кавычки..
А вообще насчет извращений - полностью согласен. Но у вендора так - и никуда не денешься! :(

Запрос уже пол-часа молотит.. 170+ таблиц, однако..
...
Рейтинг: 0 / 0
Один запрос из многих таблиц
    #36963605
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
aquamanMark Barinstein,

Провел тест: таблицы без кавычек прекрасно видятся даже если их имена заключить в кавычки..
А вообще насчет извращений - полностью согласен. Но у вендора так - и никуда не денешься! :(

Запрос уже пол-часа молотит.. 170+ таблиц, однако..Я говорил про таблицы типа
create table "ITMUSER""KLZ_DISK"

А про время - создайте индексы на WRITETTIME в каждой таблице, если нужна скорость.
Можете добавить ' with ur' в конец insert select, чтоб не блокировать таблицы, если не надо...
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Один запрос из многих таблиц
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]