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

Откуда:
Сообщений: 890
DECLARE @A TABLE(id INT not null)
DECLARE @B TABLE(id INT not null)
DECLARE @C TABLE(id INT not null)

INSERT @A (id) VALUES (1),(2),(3), (4)
INSERT @B (id) VALUES (2),(3),(4)
INSERT @C (id) VALUES (3),(4),(5)


SELECT * FROM @A AS a
LEFT JOIN @B AS b ON a.id = b.id
INNER JOIN @C AS c ON b.id=c.id

id id id
3 3 3
4 4 4


SELECT * FROM 
		@A AS a 
		LEFT JOIN
			(@B AS b INNER JOIN
			 @C AS c ON b.id=c.id) 
		ON a.id=b.id

id id id
1 NULL NULL
2 NULL NULL
3 3 3
4 4 4



SELECT * FROM @A AS a
INNER JOIN @B AS b ON a.id = b.id
LEFT JOIN @C AS c ON b.id=c.id


id id id
2 2 NULL
3 3 3
4 4 4


в faq не нашел, оставлю это здесь
30 янв 12, 03:48    [11993716]     Ответить | Цитировать Сообщить модератору
 Re: определение порядка join  [new]
AndreTM
Member

Откуда: Где-то в вологодских лесах...
Сообщений: 6900
А в чем проблема-то? Не знаем видов связи? Не умеем пользоваться планами?
Хорошо, порассуждаем...
-- лемма: неиспользование скобок приводит к интерпретации запроса по порядку "слева направо"
3) @A INNER @B даёт {2;3;4}, затем этот набор и LEFT @C даёт три получившихся записи, при этом {2} не имеет связи...
2) @B INNER @C (раз в скобках) даёт {3;4}, затем @A LEFT (сначала четыре имеющихся записи в @A, а потом уже две в результирующей связи) @B даёт четыре записи, при этом связи есть только с {3,4}...
1) @A LEFT @B даёт четыре записи - {null,;2;3;4}, затем INNER @C даёт {3;4}...
30 янв 12, 04:57    [11993732]     Ответить | Цитировать Сообщить модератору
 Re: определение порядка join  [new]
Var79
Member

Откуда:
Сообщений: 890
AndreTM,

как выяснилось некоторые люди, какое то время использующие SQL, не знают синтаксиса для задания порядка (группы?) соединений.
Удобно просто дать ссылку на пример.
30 янв 12, 05:14    [11993739]     Ответить | Цитировать Сообщить модератору
 Re: определение порядка join  [new]
Var79
Member

Откуда:
Сообщений: 890
AndreTM,

например бывает пишут подзапросы хотя подзапрос не обязателен
30 янв 12, 05:16    [11993740]     Ответить | Цитировать Сообщить модератору
 Re: определение порядка join  [new]
AndreTM
Member

Откуда: Где-то в вологодских лесах...
Сообщений: 6900
о чём и говорим - "скобки, скобки...". Не врЕменные же таблицы создавать...

Впрочем, научите "людей" хотя бы пользоваться CTE.
30 янв 12, 05:44    [11993743]     Ответить | Цитировать Сообщить модератору
 Re: определение порядка join  [new]
AndreTM
Member

Откуда: Где-то в вологодских лесах...
Сообщений: 6900
С другой стороны, использование DISTINCT приведет (в вашем примере) к однозначному результату. Но потребует (в плане выполнения) отдельной сортировки.

И вообще, где-то возможно (и даже рекомендовано) использование индексов; где-то - выгодно как раз построить последовательную выборку...
30 янв 12, 05:53    [11993744]     Ответить | Цитировать Сообщить модератору
 Re: определение порядка join  [new]
Glory
Member

Откуда:
Сообщений: 104751
Var79
в faq не нашел, оставлю это здесь

У вас 3 разных запроса. Причем тут порядок соединений ?
30 янв 12, 10:39    [11994494]     Ответить | Цитировать Сообщить модератору
 Re: определение порядка join  [new]
ZOOKABAKODER
Member

Откуда:
Сообщений: 178
Var79
в faq не нашел, оставлю это здесь

JOIN это лево-ассоциативный тернарный оператор, с операндами: {таблица 0} {таблица 1} {логическое выражение}. Соответственно и вычисляется:

@A join @B on {AB} join @C on {ABC} <=> (@A join @B on {AB}) join @C on {ABC}
@A join @B join @C on {BC} on {ABC} <=> @A join (@B join @C on {BC}) on {ABC}
и left/right/inner/full неважно.

@A LEFT JOIN @B ON a.id = b.id INNER JOIN @C ON b.id=c.id это равносильно (@A LEFT JOIN @B ON a.id = b.id) INNER JOIN @C ON b.id=c.id т.е. результат LEFT JOIN @A и @B
@A.id@B.id
1NULL
22
33
44
приходит в INNER JOIN с @C и остаются только те записи в которых b.id не NULL.

@A left join (@B inner join @C on b.id = c.id) тут сначала выполняются скобки и результат inner join @B и @C
@B.id@C.id
33
44
приходит в @A LEFT JOIN соответственно и результат выходит.

@A INNER JOIN @B ON a.id = b.id LEFT JOIN @C ON b.id = c.id опять же: результат INNER JOIN @A и @B
@A.id@B.id
22
33
44
приходит в LEFT JOIN @C и т.п.

Никакой мистики. :)
30 янв 12, 11:19    [11994832]     Ответить | Цитировать Сообщить модератору
 Re: определение порядка join  [new]
Var79
Member

Откуда:
Сообщений: 890
Glory
Var79
в faq не нашел, оставлю это здесь

У вас 3 разных запроса. Причем тут порядок соединений ?

SELECT * FROM 
		@A AS a 
		LEFT JOIN
			(@B AS b INNER JOIN
			 @C AS c ON b.id=c.id) 
		ON a.id=b.id

суть в этом,

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

З.Ы.
разве я задавал какие то вопросы, что бы на них отвечали? :)
30 янв 12, 16:02    [11997426]     Ответить | Цитировать Сообщить модератору
 Re: определение порядка join  [new]
SanyL
Member

Откуда: Москва
Сообщений: 4540
Var79
в faq не нашел, оставлю это здесь


не совсем понял в чем суть проблемы - но исчерпывающая информация по соединениям есть в BOL... не нужно ни чего гуглить и выгугливать.

Почитайте про то как работают LEFT JOIN и RIGHT JOIN - все поймете сами... чтото комментировать не зная что непонятно - сложно.
30 янв 12, 16:08    [11997494]     Ответить | Цитировать Сообщить модератору
 Re: определение порядка join  [new]
Glory
Member

Откуда:
Сообщений: 104751
Var79
просто что бы кто то загуглил "как задать поярдок join" и нашел ответ.

Использование скобок в выражениях одинаково. Хоть для join-ов, хоть для чего другого

2+2*2 и (2+2)*2
30 янв 12, 16:12    [11997538]     Ответить | Цитировать Сообщить модератору
 Re: определение порядка join  [new]
Var79
Member

Откуда:
Сообщений: 890
Glory,
а пишут
SELECT * FROM  @A AS a 
		LEFT JOIN (select ... from ...) x ON a.id=x.id
30 янв 12, 16:17    [11997595]     Ответить | Цитировать Сообщить модератору
 Re: определение порядка join  [new]
Glory
Member

Откуда:
Сообщений: 104751
Var79
Glory,
а пишут
SELECT * FROM  @A AS a 
		LEFT JOIN (select ... from ...) x ON a.id=x.id

И что в этом неправильного ?
30 янв 12, 16:19    [11997611]     Ответить | Цитировать Сообщить модератору
 Re: определение порядка join  [new]
Var79
Member

Откуда:
Сообщений: 890
Glory,

все правильно, а к чему вопрос :)
30 янв 12, 16:22    [11997642]     Ответить | Цитировать Сообщить модератору
 Re: определение порядка join  [new]
Glory
Member

Откуда:
Сообщений: 104751
Var79
все правильно, а к чему вопрос :)

Вы создали тему про некий "порядок join"
Которая оказывается темой про то, как скобки влияют на порядок обработки выражений.
Вопрос - зачем ?
30 янв 12, 16:24    [11997663]     Ответить | Цитировать Сообщить модератору
 Re: определение порядка join  [new]
Var79
Member

Откуда:
Сообщений: 890
Glory,

я встречаю не первый раз что некоторые об этом не знают (о синтаксисе).

в следующий раз просто кину ссылку на эту тему

вообще в FAQ было бы неплохо поместить такой запрос
SELECT * FROM 
		@A AS a 
		LEFT JOIN
			(@B AS b INNER JOIN
			 @C AS c ON b.id=c.id) 
		ON a.id=b.id


вы считаете что пример такого синтаксиса лишний? Или что сама фича не нужена вообще?
30 янв 12, 16:30    [11997720]     Ответить | Цитировать Сообщить модератору
 Re: определение порядка join  [new]
Var79
Member

Откуда:
Сообщений: 890
Glory,

можно конечно думать что акцент на теме не имеет смысла, но тогда почему многие пишут поздапрос, может быть конечно поздапросом нагляднее, но знать и о таком синтаксисе нужно
30 янв 12, 16:32    [11997735]     Ответить | Цитировать Сообщить модератору
 Re: определение порядка join  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
Glory
Var79
все правильно, а к чему вопрос :)

Вы создали тему про некий "порядок join"
Которая оказывается темой про то, как скобки влияют на порядок обработки выражений.
Вопрос - зачем ?
Вообще-то, скобки в JOINах никак ни на что не влияют!
30 янв 12, 16:33    [11997737]     Ответить | Цитировать Сообщить модератору
 Re: определение порядка join  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
Собственно говоря, по поводу скобок - это древний баян:
https://www.sql.ru/forum/actualsearch.aspx?search=%F1%EA%EE%E1%EA%E8+JOIN&sin=0&bid=1&a=iap&ma=2&dt=-1&s=1&so=1
30 янв 12, 16:38    [11997777]     Ответить | Цитировать Сообщить модератору
 Re: определение порядка join  [new]
Glory
Member

Откуда:
Сообщений: 104751
Var79
вообще в FAQ было бы неплохо поместить такой запрос

Для чего, если все уже описано в оффициальном хелпе ?

http://msdn.microsoft.com/en-us/library/ms177634.aspx
30 янв 12, 16:38    [11997779]     Ответить | Цитировать Сообщить модератору
 Re: определение порядка join  [new]
SanyL
Member

Откуда: Москва
Сообщений: 4540
Var79
вы считаете что пример такого синтаксиса лишний? Или что сама фича не нужена вообще?


Вопрос не ко мне - но мое ИМХО: эта фича ненужна и лично я против ее использования. Почему? Сложнее поддерживать - когда возникает вопрос оптимизации, то такой джоин несколько "скрыт" = значит это потенциальный повод для ошибки в будущем.
30 янв 12, 16:45    [11997826]     Ответить | Цитировать Сообщить модератору
 Re: определение порядка join  [new]
Var79
Member

Откуда:
Сообщений: 890
iap,

да но сравните 1 и 2 запрос (ну а 3й приведен просто если "on" будет на "привычном месте")

DECLARE @A TABLE(id INT not null)
DECLARE @B TABLE(id INT not null)
DECLARE @C TABLE(id INT not null)

INSERT @A (id) VALUES (1),(2),(3), (4)
INSERT @B (id) VALUES (2),(3),(4)
INSERT @C (id) VALUES (3),(4),(5)

SELECT * FROM 
@A AS a 
LEFT JOIN
(@B AS b INNER JOIN
 @C AS c ON b.id=c.id) 
ON a.id=b.id
		
SELECT * FROM @A AS a 
LEFT JOIN @B AS b
INNER JOIN @C AS c ON b.id=c.id
ON a.id=b.id		
		
SELECT * FROM @A AS a 
LEFT JOIN @B AS b ON a.id=b.id
INNER JOIN @C AS c ON b.id=c.id


вобщем считаете - "тема не очем " - удаляйте
30 янв 12, 16:46    [11997834]     Ответить | Цитировать Сообщить модератору
 Re: определение порядка join  [new]
Var79
Member

Откуда:
Сообщений: 890
SanyL
чтото комментировать не зная что непонятно - сложно.

всё понятно, не для меня тема
30 янв 12, 16:51    [11997889]     Ответить | Цитировать Сообщить модератору
 Re: определение порядка join  [new]
Var79
Member

Откуда:
Сообщений: 890
iap,

всмысле они одинаковы но 1й выглядит лучше имхо
30 янв 12, 16:54    [11997908]     Ответить | Цитировать Сообщить модератору
 Re: определение порядка join  [new]
Var79
Member

Откуда:
Сообщений: 890
iap,

одинаковые первые два разумеется
30 янв 12, 16:55    [11997920]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить