Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
 Почему join синтаксис такой не популярный у ораклоидов?  [new]
Sash*
Member

Откуда: город на реке
Сообщений: 5819
наезжают типа пиши объединения через запятую. Спрашиваю почему? - так же удобнее - отвечают мол стандарт такой.

а нафига оно мне так??

SQL Navigator тоже вот через запятую генерит
27 апр 05, 16:37    [1502629]     Ответить | Цитировать Сообщить модератору
 Re: Почему join синтаксис такой не популярный у ораклоидов?  [new]
hell
Member

Откуда:
Сообщений: 3001
Sash*
наезжают типа пиши объединения через запятую. Спрашиваю почему? - так же удобнее - отвечают мол стандарт такой.

а нафига оно мне так??

SQL Navigator тоже вот через запятую генерит



Не было раньше join ов, потом они работали немного глючновато, вот и предубеждения.
27 апр 05, 16:41    [1502655]     Ответить | Цитировать Сообщить модератору
 Re: Почему join синтаксис такой не популярный у ораклоидов?  [new]
Oleg Afanasiev
Member

Откуда: Киев
Сообщений: 3742
а потом они вообще не нужны
Будут.
В таком виде. :)

-----------------------
Вечны налоги,
Смерть и потеря данных.
Что на этот раз?
27 апр 05, 16:43    [1502667]     Ответить | Цитировать Сообщить модератору
 Re: Почему join синтаксис такой не популярный у ораклоидов?  [new]
tru55
Member

Откуда: СПб
Сообщений: 19790
Опять же, с плюсиком короче Картинка с другого сайта.
27 апр 05, 16:43    [1502669]     Ответить | Цитировать Сообщить модератору
 Re: Почему join синтаксис такой не популярный у ораклоидов?  [new]
val-demar
Member

Откуда: Ukraine,Kyiv
Сообщений: 454
У плюсика есть ряд ограничений
FM

Oracle Corporation recommends that you use the FROM clause OUTER JOIN syntax rather than the Oracle join operator. Outer join queries that use the Oracle join operator (+) are subject to the following rules and restrictions, which do not apply to the FROM clause join syntax:
You cannot specify the (+) operator in a query block that also contains FROM clause join syntax.
The (+) operator can appear only in the WHERE clause or, in the context of left-correlation (that is, when specifying the TABLE clause) in the FROM clause, and can be applied only to a column of a table or view.
If A and B are joined by multiple join conditions, then you must use the (+) operator in all of these conditions. If you do not, then Oracle will return only the rows resulting from a simple join, but without a warning or error to advise you that you do not have the results of an outer join.
The (+) operator does not produce an outer join if you specify one table in the outer query and the other table in an inner query.
You cannot use the (+) operator to outer-join a table to itself, although self joins are valid. For example, the following statement is not valid:

-- The following statement is not valid:
SELECT employee_id, manager_id
FROM employees
WHERE employees.manager_id(+) = employees.employee_id;


However, the following self join is valid:

SELECT e1.employee_id, e1.manager_id, e2.employee_id
FROM employees e1, employees e2
WHERE e1.manager_id(+) = e2.employee_id;


The (+) operator can be applied only to a column, not to an arbitrary expression. However, an arbitrary expression can contain one or more columns marked with the (+) operator.
A condition containing the (+) operator cannot be combined with another condition using the OR logical operator.
A condition cannot use the IN comparison condition to compare a column marked with the (+) operator with an expression.
A condition cannot compare any column marked with the (+) operator with a subquery.

If the WHERE clause contains a condition that compares a column from table B with a constant, then the (+) operator must be applied to the column so that Oracle returns the rows from table A for which it has generated nulls for this column. Otherwise Oracle will return only the results of a simple join.

In a query that performs outer joins of more than two pairs of tables, a single table can be the null-generated table for only one other table. For this reason, you cannot apply the (+) operator to columns of B in the join condition for A and B and the join condition for B and C.2) Сталкивался с таким.
27 апр 05, 16:51    [1502714]     Ответить | Цитировать Сообщить модератору
 Re: Почему join синтаксис такой не популярный у ораклоидов?  [new]
Sash*
Member

Откуда: город на реке
Сообщений: 5819
val-demar
че-то я конец совсем не понял не могли бы пояснить?
27 апр 05, 16:59    [1502759]     Ответить | Цитировать Сообщить модератору
 Re: Почему join синтаксис такой не популярный у ораклоидов?  [new]
Scott Tiger
Member

Откуда: вмваре
Сообщений: 6876
Неправда, объективно удобнее писать через запятую и соединяя в where. Хотя бы потому, что читать это легче. Так естественнее. ANSI-синтаксис я воспринимаю с очень большим трудом.
27 апр 05, 17:24    [1502892]     Ответить | Цитировать Сообщить модератору
 Re: Почему join синтаксис такой не популярный у ораклоидов?  [new]
val-demar
Member

Откуда: Ukraine,Kyiv
Сообщений: 454
2 Sash

- Операция (+) не выполнит внешнее соединение,если одна таблица указана во внешнем запросе,а другая во внутреннем.
- Операция (+) может применяться только к столбцам,но не к произвольным выражениям.Однако произвольные выражения могут содержать один или несколько столбцов с операцией (+)
- Условие,содержащее операцию (+) нельзя обьединять с другим условием с помощью оператора OR
- Условие не может использовать операцию сравнения IN для сравнения столбца,отмеченного операцией (+) с выражением
- Условие не может сравнивать столбец,отмеченный операцией (+) с подзапросом


З.Ы. Надеюсь ничего не нарушаю ... (По крайней мере правилами форума не запрещено ).
Перевод by РДТЕХ(с) All Rights Reserved
27 апр 05, 17:45    [1503009]     Ответить | Цитировать Сообщить модератору
 Re: Почему join синтаксис такой не популярный у ораклоидов?  [new]
Форум: Все форумы / Oracle
Guest
Scott Tiger
Неправда, объективно удобнее писать через запятую и соединяя в where. Хотя бы потому, что читать это легче. Так естественнее. ANSI-синтаксис я воспринимаю с очень большим трудом.

Полностью поддерживаю.
27 апр 05, 18:28    [1503186]     Ответить | Цитировать Сообщить модератору
 Re: Почему join синтаксис такой не популярный у ораклоидов?  [new]
hell
Member

Откуда:
Сообщений: 3001
Опять таки читать - дело привычки. Ну и сделайте full join плюсиком :-)
Я лично стараюсь join делать

"The CBO without stats is like a morning without coffee." T.Kyte
27 апр 05, 18:43    [1503235]     Ответить | Цитировать Сообщить модератору
 Re: Почему join синтаксис такой не популярный у ораклоидов?  [new]
Apex
Member

Откуда: Made in USSR
Сообщений: 3909
Я тоже использую join'ы, так нагляднее, можно визуально выделить соединения и ограничения.
27 апр 05, 18:59    [1503278]     Ответить | Цитировать Сообщить модератору
 Re: Почему join синтаксис такой не популярный у ораклоидов?  [new]
vadiminfo
Member

Откуда: Обнинск
Сообщений: 4800
Я слышал, что комитет по стандартам учитывает наработки ведущих производителей СУБД, но в плане соединений поступил жестко. Т.е. решили, что эти плюсики и звездочки (MS SQL) не достаточно хороши. Производители СУБД пошли по пути наиболее простого синтаксиса в ущерб строгости.
Может это и не так. Но мне больше нравится синтаксис с JOIN, потому что условие на соединение отделено от условий на выборку. Все-таки в рел алгебре это разные операции, а без JOIN как бы все премешано. Кроме того, естественное соединение (NATURAL JOIN) не требует написания условий. Это вообще упрощает синтаксис. Мне кажется, и проще и читабельнее. Ну, и естественно это уже во всех диалектах SQL, которые соблюдают основные рекомендации стандартов - проще понимать синтаксис других СУБД.
Тоже стараюсь писать JOIN. Просто есть еще 8-ка у некоторых заказчиков, и тада ради общности приходится писать без JOIN.
27 апр 05, 19:53    [1503403]     Ответить | Цитировать Сообщить модератору
 Re: Почему join синтаксис такой не популярный у ораклоидов?  [new]
AI
Member

Откуда: Москва
Сообщений: 2817
hell
Опять таки читать - дело привычки. Ну и сделайте full join плюсиком :-)
Я лично стараюсь join делать

"The CBO without stats is like a morning without coffee." T.Kyte


1. Посмотрите на план full outer join. Это простой union all двух outer join'ов. По другому просто нельзя его сделать.

2. Что касаемо любимого многими natural join, то он скрывает имена колонок, что приводит к потерям времени на поиск причины, почему join не работает, а потом выясняется, что в обеих таблицах есть еще одноименные колонки comments, status и еще какие-нибудь, по которым этот идиотский natural join пытается сделать связку. То есть в нормально спроектированной системе natural join практически нельзя использовать.

3. Нельзя (+) использовать с оператором or по понятной логической причине - или внешнее соединение, или еще что-то. В синтаксисе outer join просто нельзя записать такую белиберду. Другое дело, что в дополнительных условиях тоже придется ставить (+), иначе получим простой join. Это ограничение требует хотя бы двух-трехдневного опыта написания запросов с (+), что не так уж и много.

Короче, где-то короче и логичнее писать (+), где-то outer join. Если внешнее соединение не требуется, писать join или where - разницы никакой. Все зависит от привычек и, возможно, багов оракула.
28 апр 05, 08:52    [1503905]     Ответить | Цитировать Сообщить модератору
 Re: Почему join синтаксис такой не популярный у ораклоидов?  [new]
Sash*
Member

Откуда: город на реке
Сообщений: 5819
и много этих багов на десятке?
28 апр 05, 09:28    [1503981]     Ответить | Цитировать Сообщить модератору
 Re: Почему join синтаксис такой не популярный у ораклоидов?  [new]
Владимор Конев
Member

Откуда:
Сообщений: 3451
Sash*
и много этих багов на десятке?
И много этих "десяток" в промышленной эксплуатации???
28 апр 05, 09:33    [1503988]     Ответить | Цитировать Сообщить модератору
 Re: Почему join синтаксис такой не популярный у ораклоидов?  [new]
Павел Воронцов
Member

Откуда: Новосибирск
Сообщений: 2386
Блог
Scott Tiger
Неправда, объективно удобнее писать через запятую и соединяя в where. Хотя бы потому, что читать это легче. Так естественнее. ANSI-синтаксис я воспринимаю с очень большим трудом.
А мне вот наоборот - АНСИ синтаксис ближе. он ~~ правильней ~~ :-)
28 апр 05, 10:05    [1504076]     Ответить | Цитировать Сообщить модератору
 Re: Почему join синтаксис такой не популярный у ораклоидов?  [new]
Part
Member

Откуда: Краснодар
Сообщений: 187
+ явно лучше :-)))

Все дело в привычке, наверное. Хотя, ИМХО, с + читабельность выше.
А natural join действительно фи
28 апр 05, 10:15    [1504110]     Ответить | Цитировать Сообщить модератору
 Re: Почему join синтаксис такой не популярный у ораклоидов?  [new]
Sash*
Member

Откуда: город на реке
Сообщений: 5819
Владимор Конев
Sash*
и много этих багов на десятке?
И много этих "десяток" в промышленной эксплуатации???

есть
28 апр 05, 10:31    [1504181]     Ответить | Цитировать Сообщить модератору
 Re: Почему join синтаксис такой не популярный у ораклоидов?  [new]
Scott Tiger
Member

Откуда: вмваре
Сообщений: 6876
Не, шут с ними, с внешними джоинами, вопрос ещё про inner join. Зачем? Совершенно очевидно, что легче и написать, и прочитать inner join оформленный как select t1.c1, t2.c2 from t1, t2 where t1.c3=t2.c4, чем аналогичное уродство с "стандартным" синтаксисом.
28 апр 05, 10:32    [1504186]     Ответить | Цитировать Сообщить модератору
 Re: Почему join синтаксис такой не популярный у ораклоидов?  [new]
Apex
Member

Откуда: Made in USSR
Сообщений: 3909
Scott Tiger
Не, шут с ними, с внешними джоинами, вопрос ещё про inner join. Зачем? Совершенно очевидно, что легче и написать, и прочитать inner join оформленный как select t1.c1, t2.c2 from t1, t2 where t1.c3=t2.c4, чем аналогичное уродство с "стандартным" синтаксисом.

Скот, когда ты соединяешь хотя бы штук пять таблиц, да еще и наклядываешь дополнительные ограничения, у тебя после where такой паравоз получиться, что нифига не удобно читать, будешь все время смотреть где какой таблице какой алиас присвоил, чтобы понять где что с кем соединяется....
28 апр 05, 10:43    [1504240]     Ответить | Цитировать Сообщить модератору
 в догонку...  [new]
Apex
Member

Откуда: Made in USSR
Сообщений: 3909
К тому же никто не заставляет писать слово inner, его ведь можно опустить:)
28 апр 05, 10:45    [1504248]     Ответить | Цитировать Сообщить модератору
 Re: Почему join синтаксис такой не популярный у ораклоидов?  [new]
Sash*
Member

Откуда: город на реке
Сообщений: 5819
Scott Tiger
select t1.c1, t2.c2 from t1, t2 where t1.c3=t2.c4, чем аналогичное уродство с "стандартным" синтаксисом.

select t1.c1, t2.c2 
from t1, t2 
where t1.c3=t2.c4

select 
  t1.c1, t2.c2
from t1
        join t2 on t1.c3=t2.c4

что ж тут страшного такого?
28 апр 05, 10:47    [1504255]     Ответить | Цитировать Сообщить модератору
 Re: Почему join синтаксис такой не популярный у ораклоидов?  [new]
Scott Tiger
Member

Откуда: вмваре
Сообщений: 6876
Алиасы надо не от балды давать, а как сокращённое имя таблицы, и всё будет ОК. Паровоз в where тривиальо обходится, если сначала писать условия на соединение, а потом - условия ограничения выборки.
Слово inner можно не писать, только от этого понятнее не становится...

Короче, ANSI-синтаксис маст дай, спорить на эту тему я не буду, т.к., во-первых, я упёртый баран, а, во-вторых, я в данном случае абсолютно прав.

2 Sash*: гораздо больше времени уходит на то, чтобы понять, из каких таблиц идёт выборка и как они все (тут 2 таблицы, а если их 10-20?) друг с другом соединяются.
28 апр 05, 10:54    [1504292]     Ответить | Цитировать Сообщить модератору
 Re: Почему join синтаксис такой не популярный у ораклоидов?  [new]
Apex
Member

Откуда: Made in USSR
Сообщений: 3909
Scott Tiger
Алиасы надо не от балды давать, а как сокращённое имя таблицы, и всё будет ОК.

Ага, а еще лучше вообще не сокращать, тогда сразу видно будет.
28 апр 05, 11:00    [1504322]     Ответить | Цитировать Сообщить модератору
 Re: Почему join синтаксис такой не популярный у ораклоидов?  [new]
hell
Member

Откуда:
Сообщений: 3001
Scott Tiger
Алиасы надо не от балды давать, а как сокращённое имя таблицы, и всё будет ОК. Паровоз в where тривиальо обходится, если сначала писать условия на соединение, а потом - условия ограничения выборки.
Слово inner можно не писать, только от этого понятнее не становится...

Короче, ANSI-синтаксис маст дай, спорить на эту тему я не буду, т.к., во-первых, я упёртый баран, а, во-вторых, я в данном случае абсолютно прав.


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

ЗЫ: Спор ни о чем, можете еще и о zsh и bash поспорить.
28 апр 05, 11:01    [1504325]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
Все форумы / Oracle Ответить