Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Левый джойн по умолчанию / 6 сообщений из 6, страница 1 из 1
31.03.2021, 18:42
    #40058652
НеофитSQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Левый джойн по умолчанию
Захотелось сделать так, чтобы в левом джойне при ненахождении ключа давались не нули, а строчка по умолчанию.

Т.е вместо
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
with ids(i) as (
  select level from dual connect by level <=5
),
props(n,t) as (
  select 1, 'one' from dual union all
  select 2, 'two' from dual 
)
select i, nvl(t,'unknown')
  from ids 
  left join props on i=n 



разместить значения "по умолчанию" в самой таблице свойств, где им логически и место.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
with ids(i) as (
  select level from dual connect by level <=5
),
props(n,t) as (
  select 1, 'one' from dual union all
  select 2, 'two' from dual union all
  select null, 'unlisted' from dual
)
select i, coalesce(t,(select t from props where n is null))
  from ids 
  left join props on i=n 



Работает норм, если соблюдается очевидное требование уникальности ключа в таблице свойств.
Но появилась тягомотина писать подчиненные селекты на каждую колонку в таблице свойств. А хочется props.*

Сделал так:
Код: plsql
1.
2.
3.
4.
select i, p2.*
  from ids 
  left join props p1 on i=p1.n
  left join props p2 on decode(p1.n,p2.n,1) > 0


Появилась лишняя колонка p2.n, которая мне особо не нужна.
Пришлось поломать голову как убрать лишнюю колонку не перечисляя все остальные.

Стало интересно, как решаются подобные задачи когда есть несколько значений по умолчанию. Например,
Код: plsql
1.
2.
3.
4.
5.
props(mask,text) as (
  select 'Adam', 'exact match' from dual union all
  select 'Le%',  'partial match' from dual union all
  select null,   'no other match' from dual
)
...
Рейтинг: 0 / 0
31.03.2021, 19:07
    #40058661
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Левый джойн по умолчанию
cross apply + order by ... fetch first 1 row only
...
Рейтинг: 0 / 0
31.03.2021, 19:21
    #40058670
НеофитSQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Левый джойн по умолчанию
Sayan Malakshinov
cross apply + order by ... fetch first 1 row only


Инструкции неясны
...
Рейтинг: 0 / 0
31.03.2021, 19:52
    #40058688
НеофитSQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Левый джойн по умолчанию
Получилось, подсказка помогла.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
with ids(fname) as (
  select 'Adam'    from dual union all
  select 'Harry'   from dual union all
  select 'Leonard' from dual union all
  select 'Mary'    from dual union all
  select 'Lea'     from dual union all
  select 'James'   from dual
),
props(mask,text) as (
  select 'Adam', 'exact match'    from dual union all
  select 'Lea',  'exact match'    from dual union all
  select 'Le%',  'kinda match'    from dual union all
  select '%',    'no match'       from dual
)
select fname, max(mask) keep (dense_rank first order by text)
  from ids
  join props on fname like mask
 group by fname
...
Рейтинг: 0 / 0
31.03.2021, 19:58
    #40058691
SQL*Plus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Левый джойн по умолчанию
НеофитSQL
Sayan Malakshinov
cross apply + order by ... fetch first 1 row only


Инструкции неясны

Попробуйте это
...
Рейтинг: 0 / 0
31.03.2021, 20:33
    #40058696
НеофитSQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Левый джойн по умолчанию
SQL*Plus,

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


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