Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Нет возможности использовать в left join - OR  [new]
nc1318
Member

Откуда:
Сообщений: 13
Как можно переписать запрос, если нет возможности использовать в left join - OR

with tb1 as (select 1 a, 2 b, 3 c
from dual
union all
select 4, 5, 6
from dual
union all
select 7, 8, 9
from dual
union
select 80, 88, 10
from dual
union
select 24, 88, 64
from dual
union
select 733, 88, 10
from dual
union
select 456, 99, 7575
from dual
union
select 1001, 90921, 75751
from dual),
tb2 as (select 1 a, 2 b , 3 c
from dual
union
select 5, 3, 1
from dual
union
select 8, 8, 9
from dual
union
select 73, 88, 10
from dual
union
select 100, 929, 7575
from dual
union
select 1001, 9092, 75751
from dual)
select tb1.a, tb1.b, tb1.c, tb2.a, tb2.b, tb2.c
from tb1 left join tb2 on (tb1.b = tb2.b or tb1.c = tb2.c and tb1.a = tb2.a)
13 окт 19, 18:32    [21993172]     Ответить | Цитировать Сообщить модератору
 Re: Нет возможности использовать в left join - OR  [new]
nc1318
Member

Откуда:
Сообщений: 13
nc1318,

есть такой вариант, но правильно ли он будет рабоать :
with tb1 as (select 1 a, 2 b, 3 c
from dual
union all
select 4, 5, 6
from dual
union all
select 7, 8, 9
from dual
union
select 80, 88, 10
from dual
union
select 24, 88, 64
from dual
union
select 733, 88, 10
from dual
union
select 456, 99, 7575
from dual
union
select 1001, 90921, 75751
from dual),
tb2 as (select 1 a, 2 b , 3 c
from dual
union
select 5, 3, 1
from dual
union
select 8, 8, 9
from dual
union
select 73, 88, 10
from dual
union
select 100, 929, 7575
from dual
union
select 1001, 9092, 75751
from dual)
select * from tb1 left join
(
select tb1.a a1, tb1.b b1, tb1.c c1
from tb1 join tb2 on tb1.b = tb2.b
union
select tb1.a a1, tb1.b b1, tb1.c c1
from tb1 join tb2 on tb1.c = tb2.c and tb1.a = tb2.a
) tb2 on tb2.a1 = tb1.a and tb2.b1 = tb1.b and tb2.c1 = tb1.c
13 окт 19, 18:54    [21993184]     Ответить | Цитировать Сообщить модератору
 Re: Нет возможности использовать в left join - OR  [new]
Elic
Member

Откуда: 1984. Выбраковка финно-угром продолжается. КЯЗ
Сообщений: 29429
RTFM
13 окт 19, 20:35    [21993232]     Ответить | Цитировать Сообщить модератору
 Re: Нет возможности использовать в left join - OR  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 17724
nc1318
нет возможности использовать в left join - OR

Это как так?
14 окт 19, 14:01    [21993716]     Ответить | Цитировать Сообщить модератору
 Re: Нет возможности использовать в left join - OR  [new]
-2-
Member

Откуда:
Сообщений: 15015
andrey_anonymous
nc1318
нет возможности использовать в left join - OR

Это как так?
Возможно студенту в одно ухо влетело про ограниечение на оракловый синтаксис джоина, а в другое задача на внешнее соединение.
14 окт 19, 14:10    [21993727]     Ответить | Цитировать Сообщить модератору
 Re: Нет возможности использовать в left join - OR  [new]
nc1318
Member

Откуда:
Сообщений: 13
andrey_anonymous,

интересно как это можно реализовать
14 окт 19, 14:28    [21993749]     Ответить | Цитировать Сообщить модератору
 Re: Нет возможности использовать в left join - OR  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 8018
nc1318
интересно как это можно реализовать


Что реализовать?

Запрос из Вашего первого поста вроде работает (Oracle 11), что требуется и что не работает - вот лично мне совершенно не понятно.
14 окт 19, 14:31    [21993754]     Ответить | Цитировать Сообщить модератору
 Re: Нет возможности использовать в left join - OR  [new]
-2-
Member

Откуда:
Сообщений: 15015
nc1318
интересно как это можно реализовать
Если это спортивный интерес, то любое выражение булевой логики можно реализовать без OR.
Если не спортивный, то 21993232
14 окт 19, 14:37    [21993765]     Ответить | Цитировать Сообщить модератору
 Re: Нет возможности использовать в left join - OR  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 17724
-2-
nc1318
интересно как это можно реализовать
Если это спортивный интерес, то любое выражение булевой логики можно реализовать без OR.

Оно, конечно, действительно:
select tb1.a, tb1.b, tb1.c, tb2.a, tb2.b, tb2.c
  from tb1, tb2 
 where not(not(tb1.b = tb2.b(+))
   and not(tb1.c = tb2.c(+) AND tb1.a = tb2.a(+)))

но от ora-01719 на родном оракловом синтаксисе это не спасает :)
14 окт 19, 16:21    [21993896]     Ответить | Цитировать Сообщить модератору
 Re: Нет возможности использовать в left join - OR  [new]
Кобанчег
Member

Откуда: Рахів
Сообщений: 593
andrey_anonymous,

Остаётся благодарить небеса, что в подобных случаях засовывание в case спасает.
case when (tb1.b = tb2.b(+) or tb1.c = tb2.c(+) and tb1.a = tb2.a(+)) then 1 end = 1
14 окт 19, 17:27    [21993968]     Ответить | Цитировать Сообщить модератору
 Re: Нет возможности использовать в left join - OR  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 17724
Кобанчег
Остаётся благодарить небеса, что в подобных случаях засовывание в case спасает.

Это же не спортивно :)
14 окт 19, 17:30    [21993973]     Ответить | Цитировать Сообщить модератору
 Re: Нет возможности использовать в left join - OR  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 17724
andrey_anonymous
Кобанчег
засовывание в case спасает.

Это же не спортивно :)

Только decode, только хардкор!
select tb1.a, tb1.b, tb1.c, tb2.a, tb2.b, tb2.c
  from tb1, tb2 
 where 1 = decode(tb1.b, tb2.b(+), 1
                 , decode( tb1.a, tb2.a(+)
                         , decode(tb1.c, tb2.c(+), 1) 
                   )
           )
14 окт 19, 17:40    [21993978]     Ответить | Цитировать Сообщить модератору
 Re: Нет возможности использовать в left join - OR  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 17724
Ыщщо один кошмарик
select tb1.a, tb1.b, tb1.c, tb2.a, tb2.b, tb2.c
  from tb1, tb2 
 where 0 = (tb1.b - tb2.b(+))
         * ( abs( tb1.a - tb2.a(+) )
           + abs( tb1.c-tb2.c(+) ) 
           )
14 окт 19, 17:46    [21993985]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить