Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Можно ли избавиться от nvl в условии соединения? / 4 сообщений из 4, страница 1 из 1
18.12.2019, 21:13
    #39905078
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли избавиться от nvl в условии соединения?
У меня есть такой запрос:
Код: 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
c as
(
  select 0 c from dual where 0=1
  union all select 1 from dual
  union all select 2 from dual
  union all select 3 from dual
)
, t as
(
  select 0 t, 0 g, 0 demo from dual where 0=1
  union all select 1, 1, 1 from dual
  union all select 2, 1, null from dual
  union all select 3, 2, null from dual
)
, s as
(
  select 0 s, 0 c, 0 t from dual where 0=1
  union all select 11, 1, 1 from dual
  union all select 12, 1, 2 from dual
  union all select 21, 2, 1 from dual
  union all select 31, 3, 2 from dual
  union all select 32, 3, 3 from dual
)
, s1 as (select * from s join t using (t) where g = 1 and demo=1)
, s2 as (select * from s join t using (t) where g = 1)
select c.c, s2.s, s2.t, s2.g
from c
left join s1 on (s1.c = c.c)
join s2 on (s2.c = c.c and s2.s != nvl(s1.s,0))
order by c, s


c это список родительских записей, s это набор дочерних записей.
Вообще отношение между ними 1:M, но для конкретного типа записей всегда соблюдается необязательная связь 1:1 (у c может быть 0 или 1 запись s).
У некоторых дочерних записей может быть вычисляемый специальный признак, наличие которого необходимо обрабатывать особо. Поэтому у меня в запросе два альяса s1 и s2; s2 это основной, а s1 это более "специализированный", в котором проверяется специальный признак.
Мне нужно получить набор записей, в которых у дочерних записей отсутствует специальный признак.
Приложенный запрос это делает, но в нем используется функция nvl в условии соединения.
А можно ли обойтись без функции?
...
Рейтинг: 0 / 0
19.12.2019, 00:15
    #39905172
iOracleDev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли избавиться от nvl в условии соединения?
Alibek B.,

Код: 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.
with
c (c) as
(
            select 1 from dual
  union all select 2 from dual
  union all select 3 from dual
)
, t (t, g, demo) as
(
            select 1, 1, 1 from dual
  union all select 2, 1, null from dual
  union all select 3, 2, null from dual
)
, s (s, c, t) as
(
            select 11, 1, 1 from dual
  union all select 12, 1, 2 from dual
  union all select 21, 2, 1 from dual
  union all select 31, 3, 2 from dual
  union all select 32, 3, 3 from dual
)
select c.c, s.s, s.t, t.g
  from c, s, t
 where c.c = s.c
   and t.t = s.t
   and t.g = 1
   and ( t.demo != 1 or t.demo is null )
...
Рейтинг: 0 / 0
19.12.2019, 07:54
    #39905218
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли избавиться от nvl в условии соединения?
Alibek B.
альяс
У тебя алоэ цветёт?
...
Рейтинг: 0 / 0
19.12.2019, 09:35
    #39905250
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли избавиться от nvl в условии соединения?
Alibek B.,

гляньте LNNVL(s2.s = s1.s), мож Вам подойдет

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


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