powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Левый джойн по умолчанию
6 сообщений из 6, страница 1 из 1
Левый джойн по умолчанию
    #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
Левый джойн по умолчанию
    #40058661
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
cross apply + order by ... fetch first 1 row only
...
Рейтинг: 0 / 0
Левый джойн по умолчанию
    #40058670
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Sayan Malakshinov
cross apply + order by ... fetch first 1 row only


Инструкции неясны
...
Рейтинг: 0 / 0
Левый джойн по умолчанию
    #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
Левый джойн по умолчанию
    #40058691
SQL*Plus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL
Sayan Malakshinov
cross apply + order by ... fetch first 1 row only


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

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

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


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