Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Не видно столбцов из соседнего набора / 5 сообщений из 5, страница 1 из 1
25.10.2010, 11:31
    #36917502
BuryCommoner
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не видно столбцов из соседнего набора
Есть запрос с несколькими уровнями подзапросов. В общем выглядит деревообразно:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
select ...
from
  (select ...
  from
    (select ... ) q1
  left join
    (select ... ) q2 on ...
  ) q3
left join
  (select ...
  from
    (select ... ) q4
  left join
    (select xmlagg(...) from table1 t where t.field1 = q4.field1) q5 on ... -- пример возникновения ошибки
  ) q6 on ...

Итого в глубину 5 уровней. При очередном join-е для оптимизации нужно в where подставить значение из уровня выше. Если ставить его в условие on, то подзапрос сначала формирует выборку по всем данным таблицы и только потом отбирает нужные строки для сцепки по join.
Проблема заключается в том, что при переносе условия в where и использования в нём значений из предыдущего уровня DB2 перестает их узнавать. Даже переменные хранимой процедуры (запрос выполняется в процедуре) становятся неизвестными.
Код: plaintext
SQL0204N  Имя "q4.field1" не было определено.
Хотя, вроде, на более простых запросах всё отрабатывало нормально. В чем может быть дело?
Может есть ограничение на количество уровней?

---------------------------------------------------------
IS NULL OR NOT IS NULL
...
Рейтинг: 0 / 0
26.10.2010, 22:04
    #36921536
Mark Barinstein
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не видно столбцов из соседнего набора
BuryCommonerХотя, вроде, на более простых запросах всё отрабатывало нормально. В чем может быть дело?
Может есть ограничение на количество уровней?Покажите более простой работающий запрос.
Дело в том, что вы не можете использовать в подзапросе поля внешних таблиц (а только параметры или переменные процедуры или функции, в которой запрос написан), если только вы перед подзапросом не указываете слово table:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
select  1 
from sysibm.sysdummy1 a, 
--table
(
select  1 
from sysibm.sysdummy1 b
where b.IBMREQD=a.IBMREQD
) c
Раскомментируйте table и посмотрите, что получится...
...
Рейтинг: 0 / 0
01.11.2010, 07:04
    #36930369
BuryCommoner
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не видно столбцов из соседнего набора
Спасибо, проглючил, был напуган :)
Действительно, так делать нельзя. Но проблема была. Потому что в where подзапроса я так же пытался использовать переменную хранимой процедуры. Причем в подзапросах выше она нормально находилась, а именно в данном подзапросе происходила ошибка SQL0204N Имя не было определено. Проблему пока решил изменением структуры хранения.
...
Рейтинг: 0 / 0
01.11.2010, 12:47
    #36930865
Mark Barinstein
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не видно столбцов из соседнего набора
BuryCommonerНо проблема была. Потому что в where подзапроса я так же пытался использовать переменную хранимой процедуры. Причем в подзапросах выше она нормально находилась, а именно в данном подзапросе происходила ошибка SQL0204N Имя не было определено. Проблему пока решил изменением структуры хранения.Очень странно.
Вот вам тестовая процедура, она генерирует вложенность любого уровня, заданного первым параметром. Текст выполняемого запроса выводится в 3-ем параметре.
У меня до уровня 100 работает, т.е. параметр процедуры на этом уровне распознаётся.
Если будете проверять, не задавайте уровень слишком большим - инстанс упасть может по переполнению стека.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
create or replace procedure test_nested(p_lvl int, p_ibmreqd char( 1 ), out p_stmt clob(32K), out p_res int)
begin

for v as
with t(lvl, stmt) as (
values ( 1 , cast('(select * from ' as clob(32K)))
  union all
select lvl+ 1 , stmt||'(select * from '
from t
where lvl<p_lvl)
select 'set ? = (select count(1) from '||stmt||'sysibm.sysdummy1 where ibmreqd=cast(? as char(1))'||repeat(')', lvl)||')' stmt
from t
where lvl=(select max(lvl) from t)
do
  set p_stmt=v.stmt;
end for;

prepare s_stmt from p_stmt;
execute s_stmt into p_res using p_ibmreqd;

end@

call test_nested( 100 , 'Y', ?, ?)@
...
Рейтинг: 0 / 0
01.02.2011, 12:30
    #37090331
BuryCommoner
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не видно столбцов из соседнего набора
Прошу прощения за поздний ответ. Сам ошибочный запрос был утерян при оптимизации и повторить его не получилось. Проблема, скорее всего, была не в глубине вложенности. Запрос выполнялся в теле хранимой процедуры и занимал 5 экранов текста. Вероятно было превышено какое-то ограничение компилятора.
...
Рейтинг: 0 / 0
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Не видно столбцов из соседнего набора / 5 сообщений из 5, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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