2014-11-05 3 views
2

Когда я читаю о внутреннем или внешнем соединении в SQL, все примеры и описания состоят примерно из двух подключаемых таблиц. Что делать, если в запросе содержится более 2 таблиц? Это все еще считается объединением?SQL Join: выбираются ли между более чем двумя таблицами?

Я думаю, что внутреннее соединение все еще имеет смысл, даже если оно находится между несколькими таблицами; но я не уверен, что внешние соединения имеют смысл между более чем двумя таблицами.

Может кто-то прояснить эту проблему?

+0

Как и в реальном мире, мы можем присоединиться к любому партнеру (-ам). И партнер тоже может присоединиться к любому другому. Когда вы приходите к внешнему соединению, вы можете использовать внешнее соединение любому партнеру, но ваш внешний объединенный партнер не может взаимодействовать с кем-либо внутри вашей области :) –

+2

@MaheswaranRavisankar Это не мой опыт реального мира, но опять же это был давно. – Strawberry

ответ

2

Внутренние соединения и внешние соединения вполне разумны для использования с более чем двумя таблицами.
Внутренние соединения заставляют результат отображать только данные, в которых есть какая-либо строка, к которой вы присоединились, тогда как внешние соединения отображают все данные независимо от того, что.

Допустим, вы хотите присоединиться к 4 таблицы вместе ...

select * from testtable 
inner join testable2 on col1 = othercolumn 
inner join testable3 on col2 = othercolumn 
leftjoin testable4 on col3 = othercolumn 

В этом случае было бы возвращать только результаты, которые существовали во внутренние соединения, но результат не будет существовать в снаружи/слева. Вы вынуждаете тестовые таблицы 2 & 3, чтобы иметь значение для того, к чему вы присоединяетесь .. оно не может быть нулевым.

Левое соединение не имеет значения, равно ли значение null и покажет результаты. Надеюсь, это поможет некоторым ... В принципе .. если вы внутренне присоединяетесь к значению, и оно может быть пустым, тогда весь запрос будет отображаться пустым. Это сценарий, в котором вы бы использовали соединение outter. Вы не заставляете это существо существовать.

1

Большинство примеров объединений будут включать в себя две таблицы. Однако объединения могут выполняться на любом количестве таблиц.

Вы можете прочитать больше о присоединяется во всем межсетях, но вы можете начать с:

http://www.w3schools.com/sql/sql_join.asp

http://blog.codinghorror.com/a-visual-explanation-of-sql-joins/

w3schools статья первая вещь указано является:

SQL-соединения используются для объединения строк из двух или более таблиц.

Это не совсем так, поскольку вы можете даже присоединиться к столам на themselvees!

Рассмотрим:

Employees 
----- 
EmployeeId 
ManagerId 
EmployeeName 

, если вы хотите, чтобы выяснить, сотрудникам конкретного менеджера, который можно было бы записать так:

select manager.EmployeeName, subordinates.* 
from employees manager 
inner join employees subordinates on manager.employeeId = subordinates.managerId 

Для множественного соединения таблиц рассмотрим:

Employees 
---- 
EmployeeId 
ManagerId 
EmployeeName 

Departments 
---- 
DepartmentId 
DepartmentName 

EmployeeDepartments 
---- 
DepartmentId 
EmployeeId 

В этом случае, если вы хотите узнать все названия отделов, к которым принадлежал сотрудник 5, ld do:

select d.DepartmentName 
from employees e 
inner join employeeDepartments ed on e.employeeId = ed.employeeId 
inner join departments d on ed.departmentId = d.departmentId 
where e.employeeId = 5 

TLDR; - да, включая более 2 таблиц, по-прежнему считается присоединением

1

Каждое предложение объединения (логически) между двумя виртуальными таблицами, но сами виртуальные таблицы могут быть определены как объединения в дальнейшие таблицы.

Таким образом, в следующем примере

SELECT Foo 
FROM A 
     INNER JOIN B 
       ON A.X = B.X 
     INNER JOIN C 
       ON C.Y = A.Y 
        AND C.Z = B.Z 

можно считать, что логически присоединяется к В, то виртуальный стол (А х В) присоединяется к C. Колонны из всех трех из этих таблиц, таким образом, имеется в заключительной статье ON.

Вы можете управлять виртуальными таблицами, которые оцениваются путем размещения предложения ON.

В следующем примере создается виртуальная таблица (A x B) и виртуальная таблица (C x D), а затем объединяются между ними.

SELECT Foo 
FROM A 
     INNER JOIN B 
       ON A.X = B.X 
     INNER JOIN C 
        INNER JOIN D 
          ON C.Y = D.Y /*Only C and D in scope here*/ 
       ON A.Z = D.Z /*All tables back in scope*/ 

Оптимизатор запросов может фактически фактически реализовать объединения любым способом, который сохраняет семантику. Поскольку внутренние объединения являются коммутативными и ассоциативными, таблицы в приведенном выше примере могут быть свободно переупорядочены. Для внешних объединений их повторная компоновка может изменить семантику.