powered by simpleCommunicator - 2.0.29     © 2024 Programmizd 02
Map
Форумы / Oracle [игнор отключен] [закрыт для гостей] / первод в ansi sql
15 сообщений из 15, страница 1 из 1
первод в ansi sql
    #40110856
Фотография wsnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть запрос
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
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?
...
Рейтинг: 0 / 0
первод в ansi sql
    #40110867
qlost
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
капец. всегда недолюблювал этот птичий синтаксис как в вашем скрипте
зачем тут вообще джойны? exists в руки
...
Рейтинг: 0 / 0
первод в ansi sql
    #40110890
dmdmdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поскольку задача не формализована, есть подозрение, что в native запрос должен выглядеть так:

Код: plsql
1.
2.
3.
select * from t1, t2
 where t1.rid (+) = t2.rid 
 and t2.n is null



Тогда в ANSI:

Код: plsql
1.
select t1.rid, t2.rid, t2.n from t1 right join t2 on (t1.rid = t2.rid) where t2.n is null
...
Рейтинг: 0 / 0
первод в ansi sql
    #40110891
dmdmdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Также можно рекомендовать MINUS и FULL JOIN.
...
Рейтинг: 0 / 0
первод в ansi sql
    #40110900
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Почему right?
Вроде же left outer join

могу ошибаться
...
Рейтинг: 0 / 0
первод в ansi sql
    #40110930
oragraf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dmdmdm,

left
...
Рейтинг: 0 / 0
первод в ansi sql
    #40110940
dmdmdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще раз - я переставил плюсик, поскольку мне показалось, что с формулировкой задачи ошибка.

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

Соответственно, не left, а right.
...
Рейтинг: 0 / 0
первод в ansi sql
    #40111028
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dmdmdm

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


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

Код: plsql
1.
2.
3.
4.
with t1 as
( select 1 rid from dual union all
  select 2 from dual)
select rid,null,null from t1



SY.
...
Рейтинг: 0 / 0
первод в ansi sql
    #40111041
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dmdmdm

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


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

SY.
...
Рейтинг: 0 / 0
первод в ansi sql
    #40111044
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SY,

в чем отличие от
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
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
...
Рейтинг: 0 / 0
первод в ansi sql
    #40111045
Фотография Валерий Юринский
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax
SY,

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



Код: plaintext
t2.n = null
Всегда будет давать UNKNOWN (не TRUE и не FALSE)
...
Рейтинг: 0 / 0
первод в ansi sql
    #40111051
Фотография Валерий Юринский
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wsnet
Есть запрос
Код: plsql
1.
2.
3.
. . .
where t1.rid = t2.rid(+)
and t2.n(+) = null


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

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

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

Код: plsql
1.
2.
3.
4.
      RID        RID          N
---------- ---------- ----------
         1    <NULL>     <NULL>             
         2    <NULL>     <NULL>             
...
Рейтинг: 0 / 0
первод в ansi sql
    #40111073
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Валерий Юринский


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



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


.....
stax
...
Рейтинг: 0 / 0
первод в ansi sql
    #40111115
Фотография Валерий Юринский
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax
Валерий Юринский

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

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

Именно так!
...
Рейтинг: 0 / 0
первод в ansi sql
    #40111152
dmdmdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ты неправильно понял.

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

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

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

t2.n(+) = null

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


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