оракул 11g псевдоним для запроса - PullRequest
1 голос
/ 15 февраля 2012

При переходе с оракула 10g на 11g у меня есть хранимая процедура с синтаксисом, подобным следующему:

select * from table1
union
select t,y from
(select * from table2)aliasQuery
where t=aliasQuery.t

Запрос работает с 10g, но 11g возвращает ошибку, что aliasQuery не определен.

Может быть, этот синтаксис больше не поддерживается в 11g или отсутствуют некоторые конфигурации базы данных?

РЕДАКТИРОВАТЬ

Полный запрос:

select * 
  from table1 
 union 
select t, y 
  from ( select * 
          from table2 ) aliasQuery 
 where ( select max(t)
           from ( select t 
                    from table3
                   where table3.t = aliasQuery.t)
                 )>10

Ответы [ 2 ]

3 голосов
/ 15 февраля 2012

На основании статьи Ask Tom " Существует ли какой-либо предел вложенности для коррелированных подзапросов? " может показаться, что коррелированные псевдонимы подзапроса, работающие более чем на один уровень ниже, были исправленной ошибкой.Казалось бы, ваша база данных 10g не имеет исправления ошибок, в то время как ваша 11g имеет.Я пробовал ваш запрос в моей базе данных 10g, и он не работает с той же ошибкой, что и в моей базе данных 11g: ORA-00904: "ALIASQUERY"."T": invalid identifier.

Вам придется немного изменить запрос, чтобы он заработал в 11gТеперь.

2 голосов
/ 15 февраля 2012

Я могу подтвердить, что это не работает. Я получаю ту же ошибку, что и вы:

select t, y 
  from ( select 1 t, 2 y 
          from dual ) aliasQuery 
 where ( select max(t)
           from ( select t 
                    from (select 1 as t from dual) table3
                   where table3.t = aliasQuery.t)
                 )>10

Но это так:

select t, y 
  from ( select 1 t, 2 y 
          from dual ) aliasQuery 
 where ( select max(t)
           from (select 1 as t from dual) table3
          where table3.t = aliasQuery.t
        )>10

В переводе на ваш запрос вам придется переписать его так:

select * 
  from table1 
 union 
select t, y 
  from ( select * 
          from table2 ) aliasQuery 
 where ( select max(t)
           from table3 -- no need to add yet another nested select here
          where table3.t = aliasQuery.t)
       )>10

Я не могу сказать вам, почему ваш синтаксис больше не работает. Это выглядит хорошо для меня. По-видимому, область переименования таблицы больше не достигает дважды вложенного выбора, что мне немного страшно!

...