Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > СУБД, общие вопросы > Скобки в join


Автор: blur 12.7.2006, 23:57
Приветик, 
Подскажите, для чего нужны скобки в join:

(((t1 join t2 on .....) join t3 on ....) join t4 on ...) join .... и т.д

и отличается это чем-то от того, если все это записать без скобок? 

Автор: boevik 13.7.2006, 07:45
Все зависит от базы данных.
К примеру MSSQL скобки не нужны и порядок записи join-s не влияет на порядок связи таблиц при селекте.
у Access влияет. 

Автор: comtat 13.7.2006, 08:11
У MySql все делается без скобок
Код

select ... from Таблица_0
left join Таблица_1 using (Поле_1) 
#или
left join Таблица_2 on (Таблица_2.Поле_1=Таблица_0.Поле_2)
where
...
 

Автор: blur 13.7.2006, 09:20
А может кто знает как к этим скобкам относится Oracle? И еще, имеет ли значение порядок, в котором связываются таблицы? 

Автор: Ignat 13.7.2006, 09:43
Цитата(blur @  13.7.2006,  10:20 Найти цитируемый пост)
И еще, имеет ли значение порядок, в котором связываются таблицы?  

Зависит от того используется ли оптимизатор (хинты). 

Автор: blur 13.7.2006, 11:39
Цитата(Ignat @ 13.7.2006,  09:43)
Цитата(blur @  13.7.2006,  10:20 Найти цитируемый пост)
И еще, имеет ли значение порядок, в котором связываются таблицы?  

Зависит от того используется ли оптимизатор (хинты).

А можно по-подробнее про оптимизатор? 

Автор: Ignat 13.7.2006, 12:25
Цитата(blur @  13.7.2006,  12:39 Найти цитируемый пост)
А можно по-подробнее про оптимизатор? 

Об оптимизаторе есть смысл говорить применительно к конкретной БД. А Oracle я не знаю. 

Автор: LSD 13.7.2006, 15:05
Цитата(blur @  13.7.2006,  10:20 Найти цитируемый пост)
А может кто знает как к этим скобкам относится Oracle? И еще, имеет ли значение порядок, в котором связываются таблицы?

Оптимизатору все равно присутсвуют в тексте запроса скобки или нет (речь идет о тех скобках, которые не меняют смысла запроса).
А вообще, надо просто посмотреть план выполнения и все. Зачем гадать, как себя поведет оптимизатор. 

Автор: Sqlninja 18.7.2006, 11:42
Цитата(blur @  13.7.2006,  09:20 Найти цитируемый пост)
А может кто знает как к этим скобкам относится Oracle? И еще, имеет ли значение порядок, в котором связываются таблицы?  


В Oracle:
Скобки не имеют значения. 
Порядок соединения таблиц имеет значение, т.к. непосредственно влияет на план выполнения и соответственно на производительность. 

Автор: blur 18.7.2006, 12:58
Цитата(Sqlninja @  18.7.2006,  11:42 Найти цитируемый пост)
Порядок соединения таблиц имеет значение, т.к. непосредственно влияет на план выполнения и соответственно на производительность.  

А не можешь привести пример, чтобы понятнее было?  smile 
 

Автор: Sqlninja 18.7.2006, 13:42
Пример привести могу, но станет ли от этого понятнее, не знаю.  smile   Если не использовать ANSI нотацию, то порядок соединения достигается подсказкой оптимизатору   /*+ ORDERED*/

Код

SELECT          /*+ ORDERED*/
        a,b,c
        FROM           t1,t2,t3         
        WHERE        ....
        AND ....
        ...


то есть оракл будет соединять таблицы именно в том порядке, в котором они указаны в предложении FROM. Общее правило такое, что первыми должны соединяться таблицы (подзапросы и т.д.), из которых в запросе идет высокоселективная выборка, (то есть много отфильтровалось, мало выбралось) и дальше по убыванию селективности. Попробуй разный порядок соединения для нескольких таблиц и сравни планы. 80%, что они будут отличаться. Почему не 100 - отдельная тема.  smile 

Если делать так как ты писал выше, по ANSI, то подсказка не нужна, порядок и так ясен.

 

Автор: Mephisto 2.8.2006, 08:46
На сколько я знаю порядок влияет на Outer join. А скобки, как по мне, не нужны. Т.к. порядок подключения ты указываешь после самого слова join.  smile 

Автор: Olimpic21 9.8.2006, 06:40
можно вопрос?)
кратце поясните какие джоиты есть и что означают?))) плз)

Автор: boevik 9.8.2006, 07:29
INNER JOIN - результат записи между которыми есть соотвествие полей прописаных в условии связи (join)
LEFT JOIN - все записи из левой таблицы с соотвествующими записями из правой. Если нет соотвествия из правой таблицы, то поля заполняются NULL
RIGHT JOIN - все записи из правой таблицы с соотвествующими записями из левой. Если нет соотвествия из левой таблицы, то поля заполняются NULL
FULL JOIN - все записи из обоих таблиц. Если нет соотвествия в какой либо таблице, поля заполняются NULL.
Cross join - каждая запись левой таблицы связывается со всеми записями правой, т.е. декартово произведение.

Автор: Olimpic21 9.8.2006, 11:09
boevik благодарю!)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)