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

Откуда: Москва
Сообщений: 65
Уже много лет работаю с SQL Server, но недавно столкнулся с синтаксисом, который до этого не встречал - в банальном JOIN.
    JOIN ...
        JOIN ... ON ...
    ON ...

Пример:
select t1.Caption as Name,
    t2.Number + t3.Number as Number
from dbo.Table1 t1
    left join dbo.Table2 t2
        join dbo.Table3 t3 on t2.ID = t3.Table2_ID
    on t2.Table1_ID = t1.ID


Вопрос: какие плюсы (или минусы) такого синтаксиса, когда был введен и вообще откуда это???
Есть-ли какая нибудь информация или название этой конструкции? Также буду рад ссылкам.
Поиск ничего не дает, т.к. этот оператор очень распространен.
20 май 13, 15:18    [14321700]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по оператору JOIN  [new]
Glory
Member

Откуда:
Сообщений: 104751
BOL
<joined_table> ::=
{
<table_source> <join_type> <table_source> ON <search_condition>
| <table_source> CROSS JOIN <table_source>
| left_table_source { CROSS | OUTER } APPLY right_table_source
| [ ( ] <joined_table> [ ) ]

Т.е. приведенный вами пример есть всего лишь дополненный сервером документированный синтаксис
такой синтакис существует в документаиции как минимум с версии sql2000
20 май 13, 15:28    [14321778]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по оператору JOIN  [new]
VRafael
Member

Откуда: Москва
Сообщений: 65
Да, но по какой-то причине его никто не использует
Это можно увидеть даже на страницах нашего форума.
Просто я пытаюсь решить для себя, стоит-ли применять такую конструкцию
20 май 13, 15:33    [14321803]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по оператору JOIN  [new]
Glory
Member

Откуда:
Сообщений: 104751
VRafael
Да, но по какой-то причине его никто не использует

Вы провели исследования ?

VRafael
Это можно увидеть даже на страницах нашего форума.

Что "это" ? Мировую статистику использования той или иной возможности синтаксиса ?

VRafael
Просто я пытаюсь решить для себя, стоит-ли применять такую конструкцию

Это обыкновенный join.
20 май 13, 15:36    [14321821]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по оператору JOIN  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
VRafael
Просто я пытаюсь решить для себя, стоит-ли применять такую конструкцию
Хе,хе, иногда без неё никуда:
          A
LEFT JOIN B
     JOIN C ON C<->B
            ON B<->A
20 май 13, 15:50    [14321947]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по оператору JOIN  [new]
VRafael
Member

Откуда: Москва
Сообщений: 65
Glory
Вы провели исследования ?

Я не первый день на форуме! И с транзактом работаю довольно плотно, такой синтаксис я-бы не пропустил!
Glory
Это обыкновенный join

Вот это мне и показалось странным! Почему такую "обыкновенную" конструкцию не использует большинство разработчиков?
По моему это удобно в некоторых случаях..
Mnior
Хе,хе, иногда без неё никуда:

Я именно про этот случай. Сейчас и не знаю, как раньше работал без этого )))
20 май 13, 15:53    [14321972]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по оператору JOIN  [new]
Glory
Member

Откуда:
Сообщений: 104751
VRafael
Я не первый день на форуме! И с транзактом работаю довольно плотно, такой синтаксис я-бы не пропустил!

И поэтому вы можете заявлять "его никто не использует" без всяких исследований и цифр ?

VRafael
Вот это мне и показалось странным! Почему такую "обыкновенную" конструкцию не использует большинство разработчиков?

Скольких разработчиков, кроме себя, вы опросили ? Сколько из них знало о такой форме записи ?
20 май 13, 15:58    [14322009]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по оператору JOIN  [new]
Shakill
Member

Откуда: мск
Сообщений: 1887
Mnior
Хе,хе, иногда без неё никуда:
          A
LEFT JOIN B
     JOIN C ON C<->B
            ON B<->A

?
           B
      JOIN C ON C<->B
RIGHT JOIN A ON A<->B
20 май 13, 16:23    [14322190]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по оператору JOIN  [new]
VRafael
Member

Откуда: Москва
Сообщений: 65
Glory
И поэтому вы можете заявлять "его никто не использует" без всяких исследований и цифр ?

Для этого я и задал вопрос - чтобы провести "исследование", тем более здесь находится целевая аудитория. А по поводу "никто не использует" - это мое личное мнение, основанное на, опять-же, личных наблюдениях. Уверен, что я имею право высказывать свое мнение, в надежде что кто-то более осведомленный (вроде Вас, уважаемый Glory) меня поправит или подскажет где искать правду )))
Glory
Скольких разработчиков, кроме себя, вы опросили ? Сколько из них знало о такой форме записи ?

Я работаю разработчиком в крупной компании и на постоянной основе провожу ревью кода многих других, довольно сильных разработчиков T-SQL. На ряду с этим я анализирую много кода на транзакте, накопленного нашей компанией до текущего момента. Никто из них не использует такую конструкцию (во всяком случае на постоянной основе), а один из коллег утверждает что ее лучше не использовать (типа старый синтаксис, никто не юзает эту фичу и т.д.). Это и сподвигло меня задать вопрос здесь, думаю не только мне это будет интересно.
20 май 13, 16:35    [14322272]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по оператору JOIN  [new]
Glory
Member

Откуда:
Сообщений: 104751
VRafael
Для этого я и задал вопрос - чтобы провести "исследование", тем более здесь находится целевая аудитория. А по поводу "никто не использует" - это мое личное мнение, основанное на, опять-же, личных наблюдениях. Уверен, что я имею право высказывать свое мнение, в надежде что кто-то более осведомленный (вроде Вас, уважаемый Glory) меня поправит или подскажет где искать правду )))

Высказывание личного мнение правильно сопровождать соответствующим словосочентанием
Например, "по моему личному мнениию, такую форму записи join никто не использует"

VRafael
Я работаю разработчиком в крупной компании и на постоянной основе провожу ревью кода многих других, довольно сильных разработчиков T-SQL. На ряду с этим я анализирую много кода на транзакте, накопленного нашей компанией до текущего момента. Никто из них не использует такую конструкцию (во всяком случае на постоянной основе), а один из коллег утверждает что ее лучше не использовать (типа старый синтаксис, никто не юзает эту фичу и т.д.). Это и сподвигло меня задать вопрос здесь, думаю не только мне это будет интересно.

А вы сверяете ваши исследования с документированным синтаксисом ?
Ведь для того, чтобы написать какую то языковую конструкцию, нужно о ней по крайней мере знать
Вот вас не смущает такое ?
INNER JOIN
   (SELECT bea.BusinessEntityID, a.City 
    FROM Person.Address AS a
    INNER JOIN Person.BusinessEntityAddress AS bea
    ON a.AddressID = bea.AddressID) AS d
    ON p.BusinessEntityID = d.BusinessEntityID

Здесь тоже два ON идут подряд
20 май 13, 16:42    [14322333]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по оператору JOIN  [new]
VRafael
Member

Откуда: Москва
Сообщений: 65
Glory
А вы сверяете ваши исследования с документированным синтаксисом ?
Ведь для того, чтобы написать какую то языковую конструкцию, нужно о ней по крайней мере знать
Вот вас не смущает такое ?
INNER JOIN
   (SELECT bea.BusinessEntityID, a.City 
    FROM Person.Address AS a
    INNER JOIN Person.BusinessEntityAddress AS bea
    ON a.AddressID = bea.AddressID) AS d
    ON p.BusinessEntityID = d.BusinessEntityID

Здесь тоже два ON идут подряд

Такая конструкция известна всембольшинству и мной активно используется.
Другое дело - конструкция указанная в топике, я тоже думаю что о ней мало кто знает из разработчиков.
20 май 13, 17:06    [14322562]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по оператору JOIN  [new]
Glory
Member

Откуда:
Сообщений: 104751
VRafael
Такая конструкция известна всембольшинству и мной активно используется.
Другое дело - конструкция указанная в топике, я тоже думаю что о ней мало кто знает из разработчиков.

И не говорите - совешенно другая конструкция. Ничего похожего
select *
from sysobjects a
inner join syscolumns b 
       join sysindexes c 
       on c.id = b.id 
       on b.id = a.id

select *
from sysobjects a
inner join (syscolumns b 
	join sysindexes c 
        on c.id = b.id) 
        on b.id = a.id

INNER JOIN
   (SELECT bea.BusinessEntityID, a.City 
    FROM Person.Address AS a
    INNER JOIN Person.BusinessEntityAddress AS bea
    ON a.AddressID = bea.AddressID) AS d
    ON p.BusinessEntityID = d.BusinessEntityID
20 май 13, 17:13    [14322620]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по оператору JOIN  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
VRafael,

Это не разный синтаксис, это один и тот же документированный синтаксис. Возможно на примере вам станет понятнее:
declare @t1 table (t1_id int primary key, name varchar(100));
declare @t2 table (t2_id int primary key, name varchar(100), t1_id int);
declare @t3 table (t3_id int primary key, t2_id int);

insert into @t1
values
 (1, 't1_a'), (2, 't1_b');

insert into @t2
values
 (1, 't2_a', 1), (2, 't2_b', 2);

insert into @t3
values
 (1, 1), (2, null);
 
select
 t3.t3_id, t2.name, t1.name
from
 @t3 t3 left join
 @t2 t2 on t2.t2_id = t3.t2_id left join
 @t1 t1 on t1.t1_id = t2.t1_id;

/*Скобки использованы только для улучшения читаемости*/
select
 t3.t3_id, t2.name, t1.name
from
 @t3 t3 left join
 (
  @t2 t2 join
  @t1 t1 on t1.t1_id = t2.t1_id
 ) on t2.t2_id = t3.t2_id;
20 май 13, 17:20    [14322683]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по оператору JOIN  [new]
Shakill
Member

Откуда: мск
Сообщений: 1887
VRafael
Другое дело - конструкция указанная в топике, я тоже думаю что о ней мало кто знает из разработчиков.


можно присмотреться и увидеть, что привычный последовательный список джойнов - это не список, а всего лишь частный случай вложенности
ведь оператор JOIN может соединять только два источника - правый и левый
однако, каждым источником может быть не только таблица/вьюха, но и, в свою очередь, результат вложенного JOIN-а
если вкладывать только левый, то получим привычный частный случай:
 (a join b on ...) join c on ...) join d on ...
а если вкладывать и правый, то увидим общий случай:
(a join b on ...) join (c join d on ...) on ...
20 май 13, 17:33    [14322761]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по оператору JOIN  [new]
VRafael
Member

Откуда: Москва
Сообщений: 65
Значит это просто синтаксическое сокращение..
Спасибо Glory, invm, Shakill
Теперь все ясно
20 май 13, 17:38    [14322798]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по оператору JOIN  [new]
VRafael
Member

Откуда: Москва
Сообщений: 65
Glory
Это не разный синтаксис, это один и тот же документированный синтаксис

пример дает разные результаты на других данных
declare @t1 table (t1_id int primary key, name varchar(100));
declare @t2 table (t2_id int primary key, name varchar(100), t1_id int);
declare @t3 table (t3_id int primary key, t2_id int);

insert into @t1
values
 (1, 't1_a'), (2, 't1_b');

insert into @t2
values
 (1, 't2_a', 1), (2, 't2_b', 2),(3, 't2_c', 3);;

insert into @t3
values
 (1, 1), (2, null),(3, 3),(4,null);
 
select
 t3.t3_id, t2.name, t1.name
from
 @t3 t3 left join
 @t2 t2 on t2.t2_id = t3.t2_id left join
 @t1 t1 on t1.t1_id = t2.t1_id;

/*Скобки использованы только для улучшения читаемости*/
select
 t3.t3_id, t2.name, t1.name
from
 @t3 t3 left join
 (
  @t2 t2 join
  @t1 t1 on t1.t1_id = t2.t1_id
 ) on t2.t2_id = t3.t2_id;
20 май 13, 17:48    [14322852]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по оператору JOIN  [new]
Cygapb-007
Member

Откуда:
Сообщений: 1677
VRafael
Другое дело - конструкция указанная в топике, я тоже думаю что о ней мало кто знает из разработчиков.
Хммм.. А действительно... Спасибо))
Из своего опыта могу сказать следующее: сталкивался с ситуациями, когда в зависимости от кода типа данные надо выбирать либо из одной связки двух таблиц, либо из другой. Всегда соединял по LEFT JOIN все 4 таблицы.

Судя по конструкции из топика, правильнее было бы нечто вроде следующего:
select 
   isnull(t11.key,t12.key),
   *
from basetable bt
left join 
   table11 t11
   inner join table12 t12 on t12<->t11
   on t11<->bt
left join 
   table21 t21
   inner join table22 t22 on t22<->t21
   on t21<->bt
вместо использованного
select 
   isnull(t11.key,t12.key),
   *
from basetable bt
left join table11 t11 on t11<->bt
left join table12 t12 on t12<->t11
left join table21 t21 on t21<->bt
left join table22 t22 on t22<->t21
так как более четко указывает жесткую зависимость между парами связанных таблиц
2Glory - IMHO:)
20 май 13, 17:54    [14322882]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по оператору JOIN  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Shakill
?
           B
      JOIN C ON C<->B
RIGHT JOIN A ON A<->B
У нас за использование RIGHT не под делу сажают на кол.
И вообще есть практика описание запросов и ради такой ерунды выворачивать на изнанку? Нет Уж. Лучше уж скобки чем так.
Тем более forece order как себя поведёт?
INNER JOIN
   (SELECT bea.BusinessEntityID, a.City 
    FROM Person.Address AS a
    INNER JOIN Person.BusinessEntityAddress AS bea
    ON a.AddressID = bea.AddressID) AS d
    ON p.BusinessEntityID = d.BusinessEntityID
За такую тоже сажают.
Мол нефиг на ровном месте делать много текста. И вообще лучше без под запросов. Если надо временную вью, та лучше WITH, чем такое.

PS: Подпись тут и далее: IMXO
А то придёт кто-то типа alexeyvg и скажет что у меня какой-то там подход, на который я якобы всех натягиваю насильно, под дулом.
20 май 13, 18:02    [14322925]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по оператору JOIN  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Cygapb-007
правильнее было бы нечто вроде следующего:
select 
   isnull(t11.key,t12.key),
   *
from basetable bt
left join 
   table11 t11
   inner join table12 t12 on t12<->t11
   on t11<->bt
left join 
   table21 t21
   inner join table22 t22 on t22<->t21
   on t21<->bt
вместо использованного
select 
   isnull(t11.key,t12.key),
   *
from basetable bt
left join table11 t11 on t11<->bt
left join table12 t12 on t12<->t11
left join table21 t21 on t21<->bt
left join table22 t22 on t22<->t21
Если вы про то что хоть это и разные запросы но оба приемлемы, то я бы писал последнее, ибо если всё зажато FK-ами (или т.п.), то последний не заставляет генератор запросов делать обязательную связку, когда это не нужно.
20 май 13, 18:06    [14322943]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по оператору JOIN  [new]
Shakill
Member

Откуда: мск
Сообщений: 1887
Mnior
У нас за использование RIGHT не под делу сажают на кол.
И вообще есть практика описание запросов и ради такой ерунды выворачивать на изнанку? Нет Уж. Лучше уж скобки чем так.

это был вариант в ответ на "без неё никуда". с замечаниями не спорю, хоть на кол у нас и не сажают
20 май 13, 18:12    [14322965]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по оператору JOIN  [new]
Cygapb-007
Member

Откуда:
Сообщений: 1677
Mnior
Cygapb-007
правильнее было бы нечто вроде следующего:
+
select 
   isnull(t11.key,t12.key),
   *
from basetable bt
left join 
   table11 t11
   inner join table12 t12 on t12<->t11
   on t11<->bt
left join 
   table21 t21
   inner join table22 t22 on t22<->t21
   on t21<->bt
вместо использованного
select 
   isnull(t11.key,t12.key),
   *
from basetable bt
left join table11 t11 on t11<->bt
left join table12 t12 on t12<->t11
left join table21 t21 on t21<->bt
left join table22 t22 on t22<->t21
Если вы про то что хоть это и разные запросы но оба приемлемы, то я бы писал последнее, ибо если всё зажато FK-ами (или т.п.), то последний не заставляет генератор запросов делать обязательную связку, когда это не нужно.
а это уже надо, ятд, смотреть в план выполнения... Потому что пары таблиц жестко связаны между собой по t11.РК (t21.PK), и в первом варианте это подчеркивается в структуре запроса, тогда как во втором - связывание происходит... наверное, по bt тоже?
не готов обсуждать, но первый вариант мне кажется более логичным
опять же IMHO
20 май 13, 18:18    [14322995]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по оператору JOIN  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
VRafael
Никто из них не использует такую конструкцию (во всяком случае на постоянной основе)
Потому что таких задач очень мало. Большинство запросов - звязда.
Но не думаю что вам интересна класиффикация запросов.
VRafael
, а один из коллег утверждает что ее лучше не использовать (типа старый синтаксис, никто не юзает эту фичу и т.д.)
Брехня. Особенно про старый синтаксис.
Это основа исчисления предикатов, итак в SQL он обрезанный. Спасибо что хоть APPLY добавили.
20 май 13, 18:19    [14323005]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по оператору JOIN  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Cygapb-007
Mnior
пропущено...Если вы про то что хоть это и разные запросы но оба приемлемы, то я бы писал последнее, ибо если всё зажато FK-ами (или т.п.), то последний не заставляет генератор запросов делать обязательную связку, когда это не нужно.
а это уже надо, ятд, смотреть в план выполнения...
не готов обсуждать, но первый вариант мне кажется более логичным
опять же IMHO
Эх, зря вы в детали не смотрите. Оболочка ничто - содержимое всё. Дьявол в деталях.
Как же без планов то?!
Cygapb-007
,а в первом варианте это подчеркивается в структуре запроса
Не надо ничего в запросах подчёркивать. Подчёркивать структуру базы должна, сюрприз, структура базы.
Код должен быть верным, а во вторых удобным для повторного использования. Т.к. в большей части код сущности или понятия обворачивается во вью (и для декларативности и для множественного использования), то там должно поддерживаться механизм "минимизации" (не знаю как точно обозвать).

PS: На тон не обращайте, это не кому лично это к точности/отношению высказанного.
20 май 13, 18:28    [14323046]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по оператору JOIN  [new]
Cygapb-007
Member

Откуда:
Сообщений: 1677
Mnior
пропущено...
Код должен быть верным, а во вторых удобным для повторного использования.
Совершенно согласен, и повторюсь - понять структуру первого запроса легче, чем структуру второго, и для этого, сюрприз:)), не требуется разбирать структуру базы. А вопросы оптимизации времени выполнения могут возникнуть только при реально долгом времени выполнения запроса)
И еще раз повторюсь, в проекте был использован второй вариант, потому что не знал (не подумал?) об альтернативных вариантах:)
20 май 13, 18:39    [14323099]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по оператору JOIN  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
Что ж вы тут баяните-то, а?

Глюк или фича при join'е ?
Re: left join - не могу понять, почему запрос не возвращает записи
Интересный синтаксис. JOIN и порядок ON

Поиск: https://www.sql.ru/forum/actualsearch.aspx?search=?????? JOIN&sin=0&bid=1&a=iap&ma=2&dt=-1&s=1&so=1
20 май 13, 18:48    [14323122]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить