Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
 LEFT JOIN VS =(+)  [new]
--__Александр__--
Member

Откуда:
Сообщений: 2631
Ситуация следующая:
Сам я не специалист по Oracle(занимаюсь MS SQL Server) но ситуация так сложилась, что необходимо писать запросы к Oracle(10-ка).
Я все соединения в своих запросах пишу через LEFT/INNER JOIN. Мне админы этого Ораклового сервера заявили, что мой синтаксис "трудно понятен" для сервера и мне все соединения надо переписать, использую синтаксис перечисления таблиц во FROM и условия в WHERE.

Скажите, это администраторы с головой не дружат заблуждаются или для Oracle действительно есть разница, какой синтаксис использовать.


-----------------
open your mind
27 фев 10, 12:13    [8403289]     Ответить | Цитировать Сообщить модератору
 Re: LEFT JOIN VS =(+)  [new]
Сергей Арсеньев
Member

Откуда:
Сообщений: 4118
--__Александр__--
Скажите, это администраторы с головой не дружат заблуждаются или для Oracle действительно есть разница, какой синтаксис использовать.


Разница действительно есть. Баги про то что ANSI нотация медленней их собственной (или иногда работает не так) всплывают почти на каждой версии.

Но если у вас все работает правильно и в нотации Oracle вам тяжело работать, а как следствие будет больше ошибок, то тут ваше право рабьотать как привыкли.
27 фев 10, 12:19    [8403334]     Ответить | Цитировать Сообщить модератору
 Re: LEFT JOIN VS =(+)  [new]
JaRo
Member

Откуда:
Сообщений: 1659
Какое использовать - дело привычки.
По задумке - оба синтаксиса должны отрабатывать одинаково.
На практике - ANSI-синтаксис получился более бажным.
+ есть запросы, которые проще написать через ANSI-синтаксис (OUTER)
27 фев 10, 12:19    [8403336]     Ответить | Цитировать Сообщить модератору
 Re: LEFT JOIN VS =(+)  [new]
Le Peace
Member

Откуда: Москва
Сообщений: 8969
Александр, а как же поиск?
https://www.sql.ru/forum/actualthread.aspx?tid=564983&hl=join+vs
27 фев 10, 12:19    [8403337]     Ответить | Цитировать Сообщить модератору
 Re: LEFT JOIN VS =(+)  [new]
Сергей Арсеньев
Member

Откуда:
Сообщений: 4118
JaRo
+ есть запросы, которые проще написать через ANSI-синтаксис (OUTER)

Таковых нет. :) Все вопрос привычки.
27 фев 10, 12:20    [8403352]     Ответить | Цитировать Сообщить модератору
 Re: LEFT JOIN VS =(+)  [new]
JaRo
Member

Откуда:
Сообщений: 1659
Сергей Арсеньев
JaRo
+ есть запросы, которые проще написать через ANSI-синтаксис (OUTER)

Таковых нет. :) Все вопрос привычки.
Не будем так категоричны...
27 фев 10, 12:25    [8403388]     Ответить | Цитировать Сообщить модератору
 Re: LEFT JOIN VS =(+)  [new]
--__Александр__--
Member

Откуда:
Сообщений: 2631
Сергей Арсеньев - Спасибо.

Le Peace - каюсь )) .

-----------------
open your mind
27 фев 10, 12:26    [8403398]     Ответить | Цитировать Сообщить модератору
 Re: LEFT JOIN VS =(+)  [new]
AlexFF__|
Member

Откуда:
Сообщений: 2852
Сергей Арсеньев
JaRo
+ есть запросы, которые проще написать через ANSI-синтаксис (OUTER)

Таковых нет. :) Все вопрос привычки.


все-таки есть
27 фев 10, 12:26    [8403400]     Ответить | Цитировать Сообщить модератору
 Re: LEFT JOIN VS =(+)  [new]
Сергей Арсеньев
Member

Откуда:
Сообщений: 4118
with a as (select 1 id,'A' name from dual), b as (select 0 id, '' name from dual)
select a.*, b.name
from a, b 
where a.id = b.id (+) 
  and a.name (+) = 'A';

Мы об этом?
27 фев 10, 12:30    [8403421]     Ответить | Цитировать Сообщить модератору
 Re: LEFT JOIN VS =(+)  [new]
Андрей Панфилов
Member

Откуда: Москва > Melbourne
Сообщений: 3778
Сергей Арсеньев,

исключительно из интереса, как вот такое на (+) переписать ?

SELECT COALESCE (q1.c1, q2.c1), COALESCE (q1.c2, q2.c2)
  FROM t1
       LEFT JOIN (SELECT t2.c1, t2.c2, t3.c3
                    FROM t2, t3
                   WHERE t2.id = t3.id) q1
          ON (q1.c2 = t1.a1)
       LEFT JOIN (SELECT t4.c1, t4.c2, t5.c3
                    FROM t4, t5
                   WHERE t4.id = t5.id) q2
          ON (q2.c2 = t1.a1)
27 фев 10, 12:31    [8403430]     Ответить | Цитировать Сообщить модератору
 Re: LEFT JOIN VS =(+)  [new]
JaRo
Member

Откуда:
Сообщений: 1659
JaRo
Сергей Арсеньев
JaRo
+ есть запросы, которые проще написать через ANSI-синтаксис (OUTER)
Таковых нет. :) Все вопрос привычки.
Не будем так категоричны...
ORA-01417, а также FULL
27 фев 10, 12:32    [8403435]     Ответить | Цитировать Сообщить модератору
 Re: LEFT JOIN VS =(+)  [new]
AlexFF__|
Member

Откуда:
Сообщений: 2852
Сергей Арсеньев
with a as (select 1 id,'A' name from dual), b as (select 0 id, '' name from dual)
select a.*, b.name
from a, b 
where a.id = b.id (+) 
  and a.name (+) = 'A';

Мы об этом?


Вы абсолютно точно подметили.
27 фев 10, 12:38    [8403475]     Ответить | Цитировать Сообщить модератору
 Re: LEFT JOIN VS =(+)  [new]
Сергей Арсеньев
Member

Откуда:
Сообщений: 4118
AlexFF__|
Вы абсолютно точно подметили.

И чем эта конструкция сложнее? Вопрос привычки чтения.
Мне например читать английский тяжелее чем русский.
Но иногда переводы технических текстов с английского на русский еще тяжелее. :)
Но англичанину это не понять.

Так и тут.

Кстати о ORA-01417

Там же пишут
Сheck that this is really what you want
. И не просто так.
Дело в том, что кому то удобно что он написал про три таблицы, а имел ввиду четыре, а кому то нет.
27 фев 10, 12:46    [8403535]     Ответить | Цитировать Сообщить модератору
 Re: LEFT JOIN VS =(+)  [new]
AlexFF__|
Member

Откуда:
Сообщений: 2852
Сергей Арсеньев
AlexFF__|
Вы абсолютно точно подметили.

И чем эта конструкция сложнее? Вопрос привычки чтения.


Она не сложнее. Замечательная конструкция. Легко читается.
Просто не работает, но это мелочи ;)
27 фев 10, 12:52    [8403594]     Ответить | Цитировать Сообщить модератору
 Re: LEFT JOIN VS =(+)  [new]
JaRo
Member

Откуда:
Сообщений: 1659
Сергей Арсеньев
Кстати о ORA-01417

Там же пишут
Сheck that this is really what you want
. И не просто так.
Дело в том, что кому то удобно что он написал про три таблицы, а имел ввиду четыре, а кому то нет.
Это ни о чем не говорит. Если бы это было реальной ошибкой, то оно было бы не дрпускалось обоими нотациями. Есть случаи, когда написать надо именно так, и написание через ANSI удобнее. Собственно для меня лично - это единственный случай, когда я перехожу на ANSI (от FULL OUTER JOIN на продакшене Бог миловал)
27 фев 10, 12:54    [8403605]     Ответить | Цитировать Сообщить модератору
 Re: LEFT JOIN VS =(+)  [new]
SysOper
Member

Откуда: M
Сообщений: 9760
AlexFF__|


Она не сложнее. Замечательная конструкция. Легко читается.
Просто не работает, но это мелочи ;)


Что значит не работает?
27 фев 10, 12:56    [8403626]     Ответить | Цитировать Сообщить модератору
 Re: LEFT JOIN VS =(+)  [new]
AlexFF__|
Member

Откуда:
Сообщений: 2852
SysOper
AlexFF__|


Она не сложнее. Замечательная конструкция. Легко читается.
Просто не работает, но это мелочи ;)


Что значит не работает?

Эммм...
Не обеспечивает вывод ожидаемого множества строк, удовлетворяющих поисковому условию.
27 фев 10, 12:59    [8403638]     Ответить | Цитировать Сообщить модератору
 Re: LEFT JOIN VS =(+)  [new]
Сергей Арсеньев
Member

Откуда:
Сообщений: 4118
JaRo
Это ни о чем не говорит. Если бы это было реальной ошибкой, то оно было бы не дрпускалось обоими нотациями. Есть случаи, когда написать надо именно так, и написание через ANSI удобнее. Собственно для меня лично - это единственный случай, когда я перехожу на ANSI (от FULL OUTER JOIN на продакшене Бог миловал)


На самом деле давайте начнем с начала.

В чем коренное отличие записи
from table1,table2,...,tablen
от
join on ... jon on
?

Отличие малозаметное глазу заключается в том, что в первом случае таблицы пересекаются одновременно, а во втором последовательно с указанием порядка (т.е в случае написания join on на самом деле можно пересечь только две таблицы).

Если мы говорим об inner join разницы в этом нет. Если об outer то, результат множественнного пересечения отличается от последовательного. Читайте внимательно что написано в сообщении

Например запрос типа:
with t as (select 3 id from dual),
     x as (select 1 id from dual union select 2 id from dual),
     y as (select 1 id from dual union select 2 id from dual)
 select t.id tid, x.id xid, y.id yid
   from t,x,y
  where x.id=t.id(+)
    and y.id=t.id(+)

должен вернуть:
tidxidyid
null11
null12
null21
null22


Но поскольку большинство населения не предполагают такого результата, то пришлось внести такую ошибку, в которой это и описано.
27 фев 10, 15:44    [8404890]     Ответить | Цитировать Сообщить модератору
 Re: LEFT JOIN VS =(+)  [new]
Сергей Арсеньев
Member

Откуда:
Сообщений: 4118
AlexFF__|
Просто не работает, но это мелочи ;)

Странно у меня работала... Может у вас версия другая?
27 фев 10, 15:45    [8404899]     Ответить | Цитировать Сообщить модератору
 Re: LEFT JOIN VS =(+)  [new]
JaRo
Member

Откуда:
Сообщений: 1659
Сергей Арсеньев
JaRo
Это ни о чем не говорит. Если бы это было реальной ошибкой, то оно было бы не дрпускалось обоими нотациями. Есть случаи, когда написать надо именно так, и написание через ANSI удобнее. Собственно для меня лично - это единственный случай, когда я перехожу на ANSI (от FULL OUTER JOIN на продакшене Бог миловал)


На самом деле давайте начнем с начала.

В чем коренное отличие записи
from table1,table2,...,tablen
от
join on ... jon on
?

Отличие малозаметное глазу заключается в том, что в первом случае таблицы пересекаются одновременно, а во втором последовательно с указанием порядка (т.е в случае написания join on на самом деле можно пересечь только две таблицы).

Если мы говорим об inner join разницы в этом нет. Если об outer то, результат множественнного пересечения отличается от последовательного. Читайте внимательно что написано в сообщении

Например запрос типа:
with t as (select 3 id from dual),
     x as (select 1 id from dual union select 2 id from dual),
     y as (select 1 id from dual union select 2 id from dual)
 select t.id tid, x.id xid, y.id yid
   from t,x,y
  where x.id=t.id(+)
    and y.id=t.id(+)

должен вернуть:
tidxidyid
null11
null12
null21
null22


Но поскольку большинство населения не предполагают такого результата, то пришлось внести такую ошибку, в которой это и описано.
И? Я не понимаю сейчас, что именно Вы пытаетесь доказать? Что такие задачи не возникают? Или что при возникновении написать через ANSI такую задачу не является более удобным чем в родной нотации? Или Вы уже какую-то другую мысль доказываете?
27 фев 10, 15:54    [8404974]     Ответить | Цитировать Сообщить модератору
 Re: LEFT JOIN VS =(+)  [new]
AlexFF__|
Member

Откуда:
Сообщений: 2852
Сергей Арсеньев
...
В чем коренное отличие записи
from table1,table2,...,tablen
от
join on ... jon on
?

Отличие малозаметное глазу заключается в том, что в первом случае таблицы пересекаются одновременно, а во втором последовательно с указанием порядка ...


Без комментариев. Хотел написать по поводу
Сергей Арсеньев

Странно у меня работала... Может у вас версия другая?

но, думаю, не стоит.
27 фев 10, 15:54    [8404975]     Ответить | Цитировать Сообщить модератору
 Re: LEFT JOIN VS =(+)  [new]
JaRo
Member

Откуда:
Сообщений: 1659
Сергей Арсеньев
AlexFF__|
Просто не работает, но это мелочи ;)

Странно у меня работала... Может у вас версия другая?
Что есть "работала" - не возвращала ORA или возвращала те данные, которые требовались автору в том топике?
27 фев 10, 15:55    [8404989]     Ответить | Цитировать Сообщить модератору
 Re: LEFT JOIN VS =(+)  [new]
_Nikotin
Member

Откуда: СПб
Сообщений: 2965
Сергей Арсеньев
Отличие малозаметное глазу заключается в том, что в первом случае таблицы пересекаются одновременно, а во втором последовательно с указанием порядка (т.е в случае написания join on на самом деле можно пересечь только две таблицы).


мда... а попробовать прежде чем писать?
27 фев 10, 16:55    [8405495]     Ответить | Цитировать Сообщить модератору
 Re: LEFT JOIN VS =(+)  [new]
-2-
Member

Откуда:
Сообщений: 15330
А можно через ансишную аутерность связать: "from таблица, table(таблица.колонка_коллекционная)(+)"?
27 фев 10, 17:05    [8405560]     Ответить | Цитировать Сообщить модератору
 Re: помогите решить проблему  [new]
ОбырВалг
Guest
--__Александр__--
Ситуация следующая:
Сам я не специалист по Oracle(занимаюсь MS SQL Server) но ситуация так сложилась, что необходимо писать запросы к Oracle(10-ка).


Если это из серии " пришел спец пишущий только на ANSI и пытается навязать свои правла целой компании" - лучше увольтесь, если не хотите переучиваться. Я так понимаю что вы не один там писатель, а следовательно вашу писанину надо проверять другим людям, которые уже давно пересели на "оракловый синтаксис" и вникать в то что пишет один писатель для них уже совсем не просто.
28 фев 10, 09:36    [8407227]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
Все форумы / Oracle Ответить