Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как передать значение поля запроса, как параметр во вложенный подзапрос / 8 сообщений из 8, страница 1 из 1
29.01.2020, 17:55
    #39920124
verter
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как передать значение поля запроса, как параметр во вложенный подзапрос
Использую версию оракла 11g

Если делаю запрос с подзапросом в части select вот так
Код: plsql
1.
2.
3.
4.
5.
6.
select (
          select d2.id 
          from docs d2
          where d2.id = d.parent_id
         ) c
from docs d


то всё хорошо.

А если пытаюсь в этом запросе использовать подзапрос со 2-м и т.д. уровнем вложенности вот так

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
select (
          select r.id
          from (
             (
              select d2.id 
              from docs d2
              where d2.id = d.parent_id
             ) r
          )
       ) c
from docs d


то получаю ошибку о том, что в подзапросе не видно значение поля запроса d.parent_id, которое передаётся в подзапрос параметром.

Как в таких случаях лучше грамотнее переписать весь запрос?
Можно, конечно, функцию сделать, но не хочется так тратиться.
...
Рейтинг: 0 / 0
29.01.2020, 17:57
    #39920126
mibin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как передать значение поля запроса, как параметр во вложенный подзапрос
verter,

Вытащи поле по которому фильтруешь на уровень выше, у меня oracle понимал и делал всё правильно.
...
Рейтинг: 0 / 0
29.01.2020, 18:00
    #39920128
verter
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как передать значение поля запроса, как параметр во вложенный подзапрос
mibin
verter,

Вытащи поле по которому фильтруешь на уровень выше, у меня oracle понимал и делал всё правильно.


если вот так:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
select d.parent_id,
         (
          select r.id
          from (
             (
              select d2.id 
              from docs d2
              where d2.id = d.parent_id
             ) r
          )
       ) c
from docs d


то не прокатывает, так же выдаёт ошибку, что не видит.
...
Рейтинг: 0 / 0
29.01.2020, 18:03
    #39920130
mibin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как передать значение поля запроса, как параметр во вложенный подзапрос
verter,

Зачем именно в двойные скобки оборачивать? Вот так не поможет?

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
select d.parent_id,
         (
          select r.id
            from (
                   select d2.id 
                     from docs d2
			        --where d2.id = d.parent_id
                 ) r
		   where r.id = d.parent_id
       ) c
from docs d
...
Рейтинг: 0 / 0
29.01.2020, 18:18
    #39920136
verter
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как передать значение поля запроса, как параметр во вложенный подзапрос
mibin,

да, теперь хорошо. Спасибо!
...
Рейтинг: 0 / 0
29.01.2020, 18:20
    #39920141
Кобанчег
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как передать значение поля запроса, как параметр во вложенный подзапрос
verter
подзапрос со 2-м и т.д. уровнем вложенности
В 11g корреляция может быть только на один уровень вверх. Хотя можно добавить один уровень путем использования оператора table и collect/cast+multiset.
Код: plsql
1.
2.
3.
4.
5.
select (select value(r) id
          from table(select collect(d2.id)
                       from docs d2
                      where d2.id = d.parent_id) r) c
  from docs d


или
Код: plsql
1.
2.
3.
4.
5.
select (select value(r) id
          from (table(cast(multiset(select d2.id
                                      from docs d2
                                     where d2.id = d.parent_id) as sys.odcinumberlist)) r)) c
  from docs d


Но в операторе table коррелированные предикаты тоже нельзя запихивать вглубь.
То есть это не workaround для произвольной вложенности в отличие от UDF.

Например такое сработает в 12c, но не 11g.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
select (select value(r) id
          from table(select collect(d2.id)
                       from (select *
                               from docs
                              where d.parent_id > 0) d2
                      where d2.id = d.parent_id) r) c
  from docs d
...
Рейтинг: 0 / 0
29.01.2020, 18:33
    #39920146
verter
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как передать значение поля запроса, как параметр во вложенный подзапрос
можно само поле на верх не вытаскивать, тоже работает:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
select --d.parent_id,
         (
          select r.name
          from (
                   select d2.id,
                            d2.name 
                   from docs d2
	           --where d2.id = d.parent_id
                 ) r
          where r.id = d.parent_id
       ) c
from docs d
...
Рейтинг: 0 / 0
29.01.2020, 18:56
    #39920151
Кобанчег
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как передать значение поля запроса, как параметр во вложенный подзапрос
verter,

Я то думал тебе надо реализовать сложную логику и запрос был приведён только как набросок.

Если же требуется сделать банальный look-up в скаляре то
Код: plsql
1.
2.
select (select d2.name from docs d2 where d2.id = d.parent_id) c
  from docs d
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как передать значение поля запроса, как параметр во вложенный подзапрос / 8 сообщений из 8, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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