Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Преобразование запроса в nested table / 11 сообщений из 11, страница 1 из 1
27.04.2018, 11:18
    #39637242
Jonhson
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование запроса в nested table
Есть некий запрос

Код: plsql
1.
select id, name, attr from ...



возвращающий такое:
Код: plsql
1.
2.
3.
1, 'ABC', 123
1, 'ABC', 456
1, 'ABC', 789



есть тип
Код: plsql
1.
CREATE OR REPLACE TYPE num_tab as table of number;



хочется как-то получить вместо 3-х записей одну со сложным типом

Код: plsql
1.
1, 'ABC', {123, 456, 789}



но преобразование в духе

Код: plsql
1.
2.
select id, name, 
(cast(select attr from ... ) as num_tab) as attr_list from ...



не работает с
Код: plsql
1.
 ORA-00932: inconsistent datatypes: expected - got NUMBER



Подскажите пожалуйста, как можно обойти проблему.
...
Рейтинг: 0 / 0
27.04.2018, 11:36
    #39637266
Бельфя
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование запроса в nested table
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
with tbl as
 (select 1 id,'ABC' code,123 num from dual
  union all
  select 1 ,'ABC' ,456 from dual
  union all
  select 1 ,'ABC' ,789 from dual
  union all
  select 1 ,'DEF' ,101112 from dual)
select code
      ,clns
  from (select t.code
              ,cast((multiset (select t2.num
                                 from tbl t2
                                where t2.code = t.code)) as t_num) clns
              ,row_number() over(partition by t.code order by null) rn
          from tbl t)
 where rn = 1
...
Рейтинг: 0 / 0
27.04.2018, 11:36
    #39637268
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование запроса в nested table
Jonhson,

SQL Reference -> Cast
...
Рейтинг: 0 / 0
27.04.2018, 11:43
    #39637281
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование запроса в nested table
Jonhson
Код: plsql
1.
(cast(select attr from ... ) as num_tab)

RTFM GROUP BY + COLLECT
...
Рейтинг: 0 / 0
27.04.2018, 11:53
    #39637294
Бельфя
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование запроса в nested table
Elic, почему коллект? Я вот нагуглил( 8539160 ), что лучше multiset, так ли это?
...
Рейтинг: 0 / 0
27.04.2018, 12:10
    #39637322
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование запроса в nested table
БельфяElic, почему коллект? Я вот нагуглил( 8539160 ), что лучше multiset, так ли это?Там однобокий взгляд. В читабельности, удобности использования и сопровождаемости тоже чудовищная разница.
...
Рейтинг: 0 / 0
27.04.2018, 12:13
    #39637330
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование запроса в nested table
Бельфя
Код: plsql
1.
2.
3.
4.
5.
6.
7.
from (select t.code
              ,cast((multiset (select t2.num
                                 from tbl t2
                                where t2.code = t.code)) as t_num) clns
              ,row_number() over(partition by t.code order by null) rn
          from tbl t)
 where rn = 1

Говнокод: по сути - это группировка аналитикой.
...
Рейтинг: 0 / 0
27.04.2018, 12:28
    #39637344
dbms_photoshop
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование запроса в nested table
БельфяElic, почему коллект? Я вот нагуглил( 8539160 ), что лучше multiset, так ли это?multiset эффективнее collect по производительности когда дополнительное соединение неизбежно.
Здесь в self join вообще нет необходимости.
...
Рейтинг: 0 / 0
27.04.2018, 13:06
    #39637398
Jonhson
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование запроса в nested table
Спасибо, да multiset помог, можно было и сразу догадаться конечно.
...
Рейтинг: 0 / 0
27.04.2018, 13:11
    #39637406
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование запроса в nested table
JonhsonСпасибо, да multiset помог, можно было и сразу догадаться конечно.Да... Глядел в книгу, увидел фигу.
...
Рейтинг: 0 / 0
28.04.2018, 00:33
    #39637771
Бельфя
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование запроса в nested table
Elic, dbms_photoshop, спасибр, разницу понял. Тот же вариант с collect'ом
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
with tbl as
 (select /*+ materialize */ * from  (select 1 id, 'ABC' code, 123 num from dual
  union all
  select 1, 'ABC', 456 from dual
  union all
  select 1, 'ABC', 789 from dual
  union all
  select 1, 'DEF', 101112
    from dual))
select t.code, cast(collect(t.num order by t.num desc) as t_num) clns
  from tbl t
 group by t.code

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


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