Поскольку вы уже получили помощь по запросу, я постараюсь подсказать вопрос о синтаксисе:
В первом запросе используется менее известный синтаксис ANSI SQL, который позволяет вкладывать объединения между предложениями join
и on
. Это позволяет вам расширять / связывать ваши объединения и, вероятно, открывает множество других злых, загадочных вещей.
Теперь, хотя вложенное объединение не может ссылаться на более высокое значение в иерархии объединения, чем его непосредственный родитель, объединения над ним или за пределами его ветви могут ссылаться на него ... это именно то, что этот уродливый маленький парень делает:
select
count(*)
from Table1 as t1
join Table2 as t2
join Table3 as t3
on t2.Key = t3.Key -- join #1
and t2.Key2 = t3.Key2
on t1.DifferentKey = t3.DifferentKey -- join #2
Это выглядит немного странно, потому что соединение # 2 соединяет t1 с t2 без конкретной ссылки на t2 ... однако, оно косвенно ссылается на t2 через t3 - так как t3 соединяется с t2 в соединении # 1. Хотя это может сработать, вы можете найти следующее более (визуально) линейным и привлекательным:
select
count(*)
from Table1 as t1
join Table3 as t3
join Table2 as t2
on t2.Key = t3.Key -- join #1
and t2.Key2 = t3.Key2
on t1.DifferentKey = t3.DifferentKey -- join #2
Лично я обнаружил, что вложенность таким образом поддерживает мои утверждения в порядке, обрисовывая в общих чертах каждый уровень иерархии отношений. В качестве примечания вам не нужно указывать inner . join является неявно внутренним , если явно не указано иное.