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).


Ваш комментарий

Ваш адрес email не будет опубликован.

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