powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Проблема с передачей значения в подзапрос.
6 сообщений из 6, страница 1 из 1
Проблема с передачей значения в подзапрос.
    #32166657
Meson
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Приветствую!

Не работает следующая конструкция (ее суть - из T2 извлекается самая свежая запись, удовлетворяющая условию, определенному во внешнем запросе):

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
select T1.NR n, t.*
from   
   T1, 
   (  select *
      from 
          (select * from T2 where T2.NR=T1.NR order by T2.DATUM desc)
      where RowNum= 1 
   ) t
where T1.ID= 1 

Пишет, что во внутреннем подзапросе T1.NR не известно.

Если условие задать в явном виде:

Код: plaintext
1.
2.
3.
...
          (select * from T2 where T2.NR= 1  order by T2.DATUM desc)
...

то все работает вполне исправно.

В чем тут дело?

PS. Для создания среды тестирования этого запроса можно использовать скрипт:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
create table T1(ID integer, NR integer);
insert into T1 (ID, NR) values ( 1 ,  1 ); 
insert into T1 (ID, NR) values ( 2 ,  2 ); 
/
create table T2(ID integer, DATUM date, NR integer);
insert into T2 (ID, DATUM, NR) values ( 1 ,  to_date('05.05', 'MM.DD'),  1 ); 
insert into T2 (ID, DATUM, NR) values ( 2 ,  to_date('05.06', 'MM.DD'),  1 ); 
insert into T2 (ID, DATUM, NR) values ( 3 ,  to_date('05.07', 'MM.DD'),  1 ); 
insert into T2 (ID, DATUM, NR) values ( 4 ,  to_date('05.20', 'MM.DD'),  2 ); 
insert into T2 (ID, DATUM, NR) values ( 5 ,  to_date('05.21', 'MM.DD'),  2 ); 
insert into T2 (ID, DATUM, NR) values ( 6 ,  to_date('05.22', 'MM.DD'),  2 );
/ 
commit;
...
Рейтинг: 0 / 0
Проблема с передачей значения в подзапрос.
    #32166684
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Inline view is a view created on the fly and just for this statement execution. Another words it is a non-correlated query, while you are trying to use it as a correlated subquery. Use:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
SQL> select  *
   2     from  (
   3            select  T1.NR n,T2.*
   4              from  T1,T2
   5              where T2.NR=T1.NR
   6              order by T2.DATUM desc
   7           )
   8     where RowNum= 1 
   9   /

         N         ID DATUM             NR
 ---------- ---------- --------- ----------
 
          2            6   22 -MAY- 03            2 


SY
...
Рейтинг: 0 / 0
Проблема с передачей значения в подзапрос.
    #32167572
Meson
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
to SY
Спасибо. В чем была моя ошибка я понял. Теперь переформулировать запрос - дело техники.

Меня смещает другое. Вы говорите о некоррелированном запросе. Мне не знаком этот термин. Это устоявшееся понятие или Вы употребили его для пояснения сути дела? Можете ли Вы дать некую формулировку или ссылку, чтобы не полагаться на интуитивное понимание (повторяю, на интуитивном уровне ситуация более или менее ясна)?
...
Рейтинг: 0 / 0
Проблема с передачей значения в подзапрос.
    #32167701
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
From SQL Reference Manual:

Oracle performs a correlated subquery when the subquery references a column from a table referred to in the parent statement. A correlated subquery answers a multiple-part question whose answer depends on the value in each row processed by the parent statement.

Obviously, non-correlated subquery is one that does not reference a column from a table referred to in the parent statement. You can find references to non-correlated subquery in Tuning Guide: "Complex merging can be used for an IN clause with a non-correlated subquery, as well as for views..."

SY.
...
Рейтинг: 0 / 0
Проблема с передачей значения в подзапрос.
    #32168167
Meson
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Правильно ли я понимаю определение некоррелированного подзапроса?

Некоррелированным является такой подзапрос, который не ссылается на колонки из таблиц, упомянутых в основном запросе.

Если да, то не понятно почему в примерах 1 и 3 Oracle возвращает вполне разумный результат и лишь в случае 2 не может разрешить таблицу T1?
На первый взгляд кажется что во всех трех запросах должен "на лету" строиться View, не ссылающийся на таблицы из основного запроса и использующий лишь в секции where значение поля из внешнего запроса.

1. Подзапрос в секции select
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
select 
  T1.NR n,
  (select max(T2.ID) from T2 where T2.NR = T1.NR) i
from 
  T1
where
  T1.ID =  1 

Результат:

    n       i
 -----   -----
 
     1         3 


2. Подзапрос в секции from
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
select 
  T1.NR n,
  t.*
from 
  T1,
  (select max(T2.ID) from T2 where T2.NR = T1.NR) t
where
  T1.ID =  1 

Результат:
 
   в подзапросе неизвестно T1


3. Подзапрос в секции where
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
select 
  T1.NR n
from 
  T1
where
  T1.ID in (select T2.ID from T2 where T2.NR = T1.NR) 

Результат:

    n       
 -----   
 
     1      
...
Рейтинг: 0 / 0
Проблема с передачей значения в подзапрос.
    #32168842
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Becuase INLINE VIEW (subquery in FROM clause) can not be correlarted. And it is quite logical. In SELECT list and WHERE clause you can use column expressions so it is logical to allow correlation. IN FROM clause you list indiviual tables and views - that is why correlation in FROM clause is not allowed.

SY.
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Проблема с передачей значения в подзапрос.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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