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

Откуда:
Сообщений: 1092
Есть запрос
with t1 as
( select 1 rid from dual union all
  select 2 from dual),
  
t2 as
( select 1 rid, 2 n from dual union all
  select 2, 3 from dual union all
  select 3, null from dual
) 

select * from t1, t2
where t1.rid = t2.rid(+)
and t2.n(+) = null


Каким образом его можно переделать в ANSI SQL с Join?

Сообщение было отредактировано: 10 ноя 21, 19:50
10 ноя 21, 19:41    [22394396]     Ответить | Цитировать Сообщить модератору
 Re: первод в ansi sql  [new]
qlost
Member

Откуда:
Сообщений: 107
капец. всегда недолюблювал этот птичий синтаксис как в вашем скрипте
зачем тут вообще джойны? exists в руки

Сообщение было отредактировано: 10 ноя 21, 20:19
10 ноя 21, 20:19    [22394410]     Ответить | Цитировать Сообщить модератору
 Re: первод в ansi sql  [new]
dmdmdm
Member

Откуда: Нижний Новгород
Сообщений: 1837
Поскольку задача не формализована, есть подозрение, что в native запрос должен выглядеть так:

select * from t1, t2
 where t1.rid (+) = t2.rid 
 and t2.n is null


Тогда в ANSI:

select t1.rid, t2.rid, t2.n from t1 right join t2 on (t1.rid = t2.rid) where t2.n is null
10 ноя 21, 21:05    [22394434]     Ответить | Цитировать Сообщить модератору
 Re: первод в ansi sql  [new]
dmdmdm
Member

Откуда: Нижний Новгород
Сообщений: 1837
Также можно рекомендовать MINUS и FULL JOIN.
10 ноя 21, 21:09    [22394435]     Ответить | Цитировать Сообщить модератору
 Re: первод в ansi sql  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 9889
Почему right?
Вроде же left outer join

могу ошибаться
10 ноя 21, 21:57    [22394455]     Ответить | Цитировать Сообщить модератору
 Re: первод в ansi sql  [new]
oragraf
Member

Откуда: Moscow
Сообщений: 1385
dmdmdm,

left
11 ноя 21, 08:12    [22394509]     Ответить | Цитировать Сообщить модератору
 Re: первод в ansi sql  [new]
dmdmdm
Member

Откуда: Нижний Новгород
Сообщений: 1837
Еще раз - я переставил плюсик, поскольку мне показалось, что с формулировкой задачи ошибка.

Я понял ее так: найти строки t2, которых нет в t1.

Соответственно, не left, а right.

Сообщение было отредактировано: 11 ноя 21, 09:04
11 ноя 21, 09:00    [22394524]     Ответить | Цитировать Сообщить модератору
 Re: первод в ansi sql  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10337
dmdmdm

Я понял ее так: найти строки t2, которых нет в t1.


Ты неправильно понял. Условие t1.rid = t2.rid(+) даст все строки t1 повторенные GREATEST(1,N) где N это число раз t1.rid встречается в t2. А вот условие t2.n(+) = null довольно "хитрое". Сравнение с NULL всегда дает UNKNOWN посему запрос есть хитронавороченый

with t1 as
( select 1 rid from dual union all
  select 2 from dual)
select rid,null,null from t1


SY.
11 ноя 21, 14:48    [22394655]     Ответить | Цитировать Сообщить модератору
 Re: первод в ansi sql  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10337
dmdmdm

Я понял ее так: найти строки t2, которых нет в t1.


И даже если поменять на t2.n(+) is null мы не получим строки t2, которых нет в t1. Мы получим все строки t1 повторенные GREATEST(1,N) раз где N это число раз t1.rid встречается в t2 и t2.n is null.

SY.
11 ноя 21, 15:16    [22394669]     Ответить | Цитировать Сообщить модератору
 Re: первод в ansi sql  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 3279
SY,

в чем отличие от
SQL> ed
Wrote file afiedt.buf

  1  with t1 as
  2  ( select 1 rid from dual union all
  3    select 2 from dual),
  4  t2 as
  5  ( select 1 rid, 2 n from dual union all
  6    select 2, 3 from dual union all
  7    select 3, null from dual
  8  )
  9* select * from t1 left join t2 on (t1.rid=t2.rid and t2.n = null )
SQL> /

       RID        RID          N
---------- ---------- ----------
         1
         2

автор
А вот условие t2.n(+) = null довольно "хитрое"


"100%" внешнее соеденение (как будто т2 пустая)

.....
stax

Сообщение было отредактировано: 11 ноя 21, 15:24
11 ноя 21, 15:19    [22394672]     Ответить | Цитировать Сообщить модератору
 Re: первод в ansi sql  [new]
Валерий Юринский
Member

Откуда: Москва, "ФОРС Дистрибуция"
Сообщений: 1298
Stax
SY,

в чем отличие от
select * from t1 left join t2 on (t1.rid=t2.rid and t2.n = null )


t2.n = null
Всегда будет давать UNKNOWN (не TRUE и не FALSE)
11 ноя 21, 15:22    [22394673]     Ответить | Цитировать Сообщить модератору
 Re: первод в ansi sql  [new]
Валерий Юринский
Member

Откуда: Москва, "ФОРС Дистрибуция"
Сообщений: 1298
wsnet
Есть запрос
. . .
where t1.rid = t2.rid(+)
and t2.n(+) = null

Каким образом его можно переделать в ANSI SQL с Join?

t2.n = null
Всегда будет давать UNKNOWN (не TRUE и не FALSE)

То есть из таблицы T2 в результат никогда не попадут никакие данные (строки).

      RID        RID          N
---------- ---------- ----------
         1    <NULL>     <NULL>             
         2    <NULL>     <NULL>             
11 ноя 21, 15:35    [22394679]     Ответить | Цитировать Сообщить модератору
 Re: первод в ansi sql  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 3279
Валерий Юринский


То есть из таблицы T2 в результат никогда не попадут никакие данные (строки).



как будто т2 пустая


.....
stax
11 ноя 21, 16:48    [22394715]     Ответить | Цитировать Сообщить модератору
 Re: первод в ansi sql  [new]
Валерий Юринский
Member

Откуда: Москва, "ФОРС Дистрибуция"
Сообщений: 1298
Stax
Валерий Юринский

То есть из таблицы T2 в результат никогда не попадут никакие данные (строки).

как будто т2 пустая

Именно так!
11 ноя 21, 18:01    [22394764]     Ответить | Цитировать Сообщить модератору
 Re: первод в ansi sql  [new]
dmdmdm
Member

Откуда: Нижний Новгород
Сообщений: 1837
Ты неправильно понял.


Давайте дождемся ТС, и он нам разъяснит, кто и что понял.

Условие t1.rid = t2.rid(+) даст


Я знаю, что даст плюсик. И сознательно переставил его. О чем сообщил.

t2.n(+) = null


Именно.
11 ноя 21, 20:54    [22394821]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить