join sql

JOIN в Transact SQL

Самый простой — это CROSS JOIN — он возвращает все возможные комбинации строк из левой и правой таблицы. Например, есть 2 таблицы (авторы и книги):

SELECT *
FROM titles CROSS JOIN authors

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

По сути JOIN похож на умножение таблиц. Т.е. в результате мы получаем большую таблицу, в которой число строк = числу всех возможных комбинаций, а число строк = сумме строк из всех таблиц.

Сам по себе читсый JOIN не имеет смысла. Обычно с ним пишут какие-то фильтры, группировки. Например (2 таблицы покупатель и продавец, фильтр по одинаковым городам):

SELECT *
FROM Custpmers CROSS JOIN Employees
WHERE Customers.City = Employees.City

CROSS JOIN можно использовать для одной таблицы. Например, есть БД службы знакомств. Надо получить все возможные пары (М + Ж):

SELECT *
FROM  Peoples E1 CROSS JOIN Peoples E2 -- используем синонимы
WHERE E1.Title='Mr.' AND E2.Title='Ms.'

CROSS JOIN применяется не так часто, т.к. в ходе работы он возвращает все возможные комбинации, и потом надо его фильтровать — это 2 отдельные операции. И если мы всегда фильтруем после отработки join, то лучше фильтровать во время работы JOIN. Для этого и используется INNER JOIN.

INNER JOIN

INNER JOIN работает так же, как и CROSS JOIN, т.е. он тоже перебирает все возможные комбинации, но для каждой пары во время сборки он применяет какое-то условие (фильтр) в конструкции ON:

SELECT ProductName, CategoryName, Price
FROM Products INNER JOIN Categories
   ON Products.CategoryID = Categories.CategoryID

Данный запрос работает быстрее, чем CROSS, и код понятней.

В INNER JOIN часто встречается ошибка потери данных во время операции фильтрации (чего нет при использовании подзапросов).

LEFT JOIN

Он работает так же, как и INNER JOIN, т.е. перебирает все возможные комбинации из таблиц, используя какой-то фильтр. Но дополнительно LEFT JOIN делает проверку: не осталось ли в левой таблице (которая стоит слева от JOIN в запросе) строк, которые не нашли себе пару. Если такие строки есть, то они принудительно перемещаются в результат и получают значение NULL. Так решается проблема потери данных.

RIGHT JOIN — по аналогии с левым JOIN, только берется таблица справа.

FULL JOIN — здесь берутся все значения без пары из левой и правой таблиц.

Внимание! При применении полного, левого и правого JOIN мы должны полностью осознавать, что мы делаем, т.к. могут потеряться данные (им присвоится неизвестное значение NULL).




Добавить комментарий

Ваш e-mail не будет опубликован.