powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / получить значения из справочника
16 сообщений из 16, страница 1 из 1
получить значения из справочника
    #39810702
mama.said
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
добрый день

Есть такие входные данные

1. таблица записей
Код: plsql
1.
2.
3.
4.
5.
6.
with recs as (
  select 'Name1' as name, '_1' as val_1, '_2' as val_2 from dual union all
  select 'Name2' as name, '_2' as val_1, '_2' as val_2 from dual union all
  select 'Name3' as name, '_3' as val_1, '_1' as val_2 from dual
)
select * from recs


2. таблица справочник
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
with refs as (
  select 'STATUS' as key, '_1' as code, 'Pending'  as val from dual union all
  select 'STATUS' as key, '_2' as code, 'Approved' as val from dual union all
  select 'STATUS' as key, '_3' as code, 'Rejected' as val from dual union all
  select 'TYPE'   as key, '_1' as code, 'Save'     as val from dual union all
  select 'TYPE'   as key, '_2' as code, 'Update'   as val from dual  
)
select * from refs



Подразумевается что мы знаем что ключ 'STATUS' и его значения val относиться к колонке val_1, ключ 'TYPE' к val_2.
Получить записи и их значения приходиться делать джоин к справочнику столько раз сколько ключей.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
with recs as (
  select 'Name1' as name, '_1' as val_1, '_2' as val_2 from dual union all
  select 'Name2' as name, '_2' as val_1, '_2' as val_2 from dual union all
  select 'Name3' as name, '_3' as val_1, '_1' as val_2 from dual
)
, refs as (
  select 'STATUS' as key, '_1' as code, 'Pending'  as val from dual union all
  select 'STATUS' as key, '_2' as code, 'Approved' as val from dual union all
  select 'STATUS' as key, '_3' as code, 'Rejected' as val from dual union all
  select 'TYPE'   as key, '_1' as code, 'Save'     as val from dual union all
  select 'TYPE'   as key, '_2' as code, 'Update'   as val from dual  
)
select r.name, rf1.val as val_1, rf2.val as val_2
from recs r
left join refs rf1 on rf1.code = r.val_1 and rf1.key = 'STATUS'
left join refs rf2 on rf2.code = r.val_2 and rf2.key = 'TYPE'
order by 1



name val_1 val_2Name1 Pending UpdateName2 Approved UpdateName3 Rejected Save

В реальных данных колонок типа val_XX на данный момент 15.
Может есть более красивое решение данной задачи?
...
Рейтинг: 0 / 0
получить значения из справочника
    #39810715
Dshedoo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mama.said,

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
with recs as (
  select 'Name1' as name, '_1' as val_1, '_2' as val_2 from dual union all
  select 'Name2' as name, '_2' as val_1, '_2' as val_2 from dual union all
  select 'Name3' as name, '_3' as val_1, '_1' as val_2 from dual
)
, refs as (
  select 'STATUS' as key, '_1' as code, 'Pending'  as val from dual union all
  select 'STATUS' as key, '_4' as code, 'Approved' as val from dual union all
  select 'STATUS' as key, '_2' as code, 'Approved' as val from dual union all  
  select 'STATUS' as key, '_3' as code, 'Rejected' as val from dual union all
  select 'TYPE'   as key, '_1' as code, 'Save'     as val from dual union all
  select 'TYPE'   as key, '_2' as code, 'Update'   as val from dual  
)
select r.name
, max(case when rf.code = r.val_1 and rf.key = 'STATUS' then rf.val else null end) as val_1
, max(case when rf.code = r.val_2 and rf.key = 'TYPE'   then rf.val else null end) as val_2
from recs r, refs rf 
group by r.name
order by 1
...
Рейтинг: 0 / 0
получить значения из справочника
    #39810721
123йй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dshedoogroup by r.name
а что просили ?
...
Рейтинг: 0 / 0
получить значения из справочника
    #39810727
Dshedoo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
123ййDshedoogroup by r.name
а что просили ?
Избавиться от 15ти лефтов?
...
Рейтинг: 0 / 0
получить значения из справочника
    #39810734
123йй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dshedoo,

Код: plsql
1.
2.
3.
4.
5.
6.
with recs as (
  select 'Name1' as name, '_1' as val_1, '_2' as val_2 from dual union all
  select 'Name2' as name, '_2' as val_1, '_2' as val_2 from dual union all
    select 'Name1' as name, '_3' as val_1, '_2' as val_2 from dual union all 
  select 'Name3' as name, '_3' as val_1, '_1' as val_2 from dual
)
...
Рейтинг: 0 / 0
получить значения из справочника
    #39810740
mama.said
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
123йй,

спасибо за корректировку исходных данных, такой вариант тоже возможен
...
Рейтинг: 0 / 0
получить значения из справочника
    #39810745
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mama.said,

имхо более читабельно
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
  1  with recs as (
  2    select 'Name1' as name, '_1' as val_1, '_2' as val_2 from dual union all
  3    select 'Name2' as name, '_2' as val_1, '_2' as val_2 from dual union all
  4    select 'Name3' as name, '_3' as val_1, '_1' as val_2 from dual
  5  )
  6  , refs as (
  7    select 'STATUS' as key, '_1' as code, 'Pending'  as val from dual union all
  8    select 'STATUS' as key, '_2' as code, 'Approved' as val from dual union all
  9    select 'STATUS' as key, '_3' as code, 'Rejected' as val from dual union all
 10    select 'TYPE'   as key, '_1' as code, 'Save'     as val from dual union all
 11    select 'TYPE'   as key, '_2' as code, 'Update'   as val from dual
 12  )
 13  select
 14   name
 15   ,(select val from refs rf1 where rf1.code = r.val_1 and rf1.key = 'STATUS') val_1
 16   ,(select val from refs rf1 where rf1.code = r.val_2 and rf1.key = 'TYPE'  ) val_2
 17  --другіе поля
 18* from recs r
SQL> /

NAME  VAL_1    VAL_2
----- -------- --------
Name1 Pending  Update
Name2 Approved Update
Name3 Rejected Save



....
stax
...
Рейтинг: 0 / 0
получить значения из справочника
    #39810753
Dshedoo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
123йй,

В любом случае мы же выбираем не сферического коня в вакууме, уникальность должна быть.
Если не у name, то у другого поля, которое должно быть указано в селекте.


Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
with recs as (
  select 'Name1' as name, '_1' as val_1, '_2' as val_2 from dual union all
  select 'Name2' as name, '_2' as val_1, '_2' as val_2 from dual union all
  select 'Name1' as name, '_3' as val_1, '_1' as val_2 from dual union all 
  select 'Name3' as name, '_3' as val_1, '_1' as val_2 from dual
)
, refs as (
  select 'STATUS' as key, '_1' as code, 'Pending'  as val from dual union all
  select 'STATUS' as key, '_4' as code, 'Approved' as val from dual union all
  select 'STATUS' as key, '_2' as code, 'Approved' as val from dual union all  
  select 'STATUS' as key, '_2' as code, 'Pending' as val from dual union all  
  select 'STATUS' as key, '_3' as code, 'Rejected' as val from dual union all
  select 'TYPE'   as key, '_1' as code, 'Save'     as val from dual union all
  select 'TYPE'   as key, '_2' as code, 'Update'   as val from dual  
)
, r_recs as (select recs.*, row_number() OVER (ORDER BY dbms_random.value) as rn from recs)
select r.name
, max(case when rf.code = r.val_1 and rf.key = 'STATUS' then rf.val else null end) as val_1
, max(case when rf.code = r.val_2 and rf.key = 'TYPE'   then rf.val else null end) as val_2
from r_recs r, refs rf 
group by r.name, r.rn
order by 1
...
Рейтинг: 0 / 0
получить значения из справочника
    #39810764
123йй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dshedoo,

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
with recs as (
   select 'Name1' as name, '_1' as val_1, '_2' as val_2 from dual union all
    select 'Name1' as name, '_2' as val_1, '_2' as val_2 from dual
   )
 NAME  VAL_1    VAL_2
----- -------- --------
Name1 Pending  Update
Name1 Pending  Update

SQL> 
...
Рейтинг: 0 / 0
получить значения из справочника
    #39810769
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mama.said,

unpivot+join+pivot
...
Рейтинг: 0 / 0
получить значения из справочника
    #39810778
Dshedoo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
123ййDshedoo,

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
with recs as (
   select 'Name1' as name, '_1' as val_1, '_2' as val_2 from dual union all
    select 'Name1' as name, '_2' as val_1, '_2' as val_2 from dual
   )
 NAME  VAL_1    VAL_2
----- -------- --------
Name1 Pending  Update
Name1 Pending  Update

SQL> 



Это из-за:
Код: plsql
1.
2.
3.
4.
  select 'STATUS' as key, '_1' as code, 'Pending'  as val from dual union all
  ...
  select 'STATUS' as key, '_2' as code, 'Pending' as val from dual union all  
  ...


Где тоже явно должна быть уникальность на key+code.
...
Рейтинг: 0 / 0
получить значения из справочника
    #39810788
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dshedoo,
row_number() OVER (ORDER BY dbms_random.value) as rn
не проще ли rownum rn?

ps
не нравится мне декартовое произведенние

....
stax
...
Рейтинг: 0 / 0
получить значения из справочника
    #39810800
Dshedoo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax,

Сам не в восторге, но, учитывая, что справочник крошечный, может быть производительнее, чем 15 лефтов или 15 подзапросов, при определённых условиях.
...
Рейтинг: 0 / 0
получить значения из справочника
    #39810804
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dshedoo,

15 ключей, но значений (вал) может быть и не мало

.....
stax
...
Рейтинг: 0 / 0
получить значения из справочника
    #39810814
mama.said
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
-2-,

Спасибо

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
with recs as (
  select 'Name1' as name, '_1' as val_1, '_2' as val_2 from dual union all
  select 'Name1' as name, '_2' as val_1, '_2' as val_2 from dual union all
  select 'Name1' as name, '_3' as val_1, '_2' as val_2 from dual union all 
  select 'Name2' as name, '_2' as val_1, '_2' as val_2 from dual union all
  select 'Name3' as name, '_3' as val_1, '_1' as val_2 from dual
)
, refs as (
  select 'STATUS' as key, '_1' as code, 'Pending'  as val from dual union all
  select 'STATUS' as key, '_2' as code, 'Approved' as val from dual union all
  select 'STATUS' as key, '_3' as code, 'Rejected' as val from dual union all
  select 'TYPE'   as key, '_1' as code, 'Save'     as val from dual union all
  select 'TYPE'   as key, '_2' as code, 'Update'   as val from dual  
)
select name, val_1, val_2 from 
(
    select v.name, rf.key, rf.val as val, row_number() over(partition by v.name, rf.key order by v.name) rn
    from 
    (
      select *
      from recs r
      unpivot (
        val for src in (val_1 as 'STATUS', val_2 as 'TYPE')
      )
    ) v
    left join refs rf on rf.key = v.src and rf.code = v.val 
) pivot (
  min(val)
  for key in ('STATUS' as val_1, 'TYPE' as val_2 )
)
order by 1



name val_1 val_2Name1 Pending UpdateName1 Approved UpdateName1 Rejected UpdateName2 Approved UpdateName3 Rejected Save
...
Рейтинг: 0 / 0
получить значения из справочника
    #39810847
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mama.said,

минус
два раза перечислять типы

ps
в идеале уходить от recs (name,val1...val15)

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


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