SQL CROSS JOIN для получения каждой комбинации записей
Автор: Джим Эванс | Обновлено: 28.10.2021 | Комментарии (1) | Связанный: Подробнее > JOIN Tables
Проблема
В SQL существует множество типов соединений (INNER JOIN, OUTER JOIN, SELF JOIN, Natural JOIN и т. д.), некоторые из которых были рассмотрены в предыдущих статьях, упоминается ниже. Но как соединить таблицы, показывающие все возможные комбинации записей? В этом уроке я расскажу о перекрестном соединении в Microsoft SQL. Сервер реляционной базы данных и объясните, что это такое и приведите примеры того, когда его использовать.
Решение
Декартово произведение, как определено Матстопия — это умножение двух наборы, чтобы сформировать набор всех упорядоченных пар. Если у вас есть таблица с 10 строками и другая таблица с 5 строками, и вы используете перекрестное соединение, вы получите 5 x 10 или 50 строк в вашем наборе результатов, также известном как декартово произведение или декартово соединение. В этой статье я покажи как это сделать. Для хорошего примера декартова продукта посетите: https://www.geeksforgeeks.org/cartesian-product-of-sets/.
Учебное пособие по перекрестному соединению SQL Server
ПЕРЕКРЕСТНОЕ СОЕДИНЕНИЕ используется для отображения всех возможных комбинаций между двумя или более наборы данных. Вы можете выполнить перекрестное соединение с более чем двумя наборами данных. Перекрестные соединения обычно выполняются без критериев соединения.
Когда использовать SQL CROSS JOIN
Однако перекрестные соединенияредко используются в коде T-SQL, но они имеют свое место. Если ты пытаясь применить все строки из одной таблицы ко всем строкам другой таблицы, вы будете использовать перекрестное соединение. Вы можете использовать перекрестное соединение для создания прайс-листа для набора. клиентов, которые включают все ваши продукты. Кроме того, может использоваться перекрестное соединение. генерировать много тестовых данных. Иногда вы можете увидеть перекрестное соединение, которое ошибка забытого критерия соединения в SQL-запросе.
Пример синтаксиса SQL CROSS JOIN 1 — другой синтаксис
В этом примере я покажу 3 оператора SQL для выполнения CROSS JOIN. Последнее, являющееся предпочтительный способ. По сути, их объединяет отсутствие критериев соединения. Для в оставшейся части руководства я буду использовать предпочитаемый синтаксис CROSS JOIN! Кроме того, для следующих примеров я буду использовать AdventureWorks от Microsoft. образец базы данных.
--Пример 1: 3 способа кодирования условия перекрестного соединения --1. Старый синтаксис запятой с оператором SELECT. ВЫБЕРИТЕ d.Name как «Отдел», s.Name, s.StartTime, s.EndTime ОТ [Отдел кадров].[Отдел] d, [Человеческие ресурсы].[Shift] s --2. Обычное соединение с требуемым предикатом поддельного соединения. ВЫБЕРИТЕ d.Name как «Отдел», s.Name, s.StartTime, s.EndTime ОТ [Отдела кадров].[Отдел] d JOIN [HumanResources].[Shift] s on 1=1 --Требуется критерий присоединения --3. Предпочтительный способ! ВЫБЕРИТЕ d.Name как «Отдел», s.Name, s.StartTime, s.EndTime ОТ [Отдела кадров].[Отдел] d ПЕРЕКРЕСТНОЕ СОЕДИНЕНИЕ [Человеческие ресурсы].[Shift] s; ИДТИ
SQL CROSS JOIN, пример 2 — перекрестное соединение трех таблиц, пункт
В этом примере я продемонстрирую перекрестное соединение с тремя столами. Первая таблица [HumanResources].[Shift] имеет 3 ряда; вторая таблица [HumanResources].[Department] имеет 16 строк; и третья таблица [HumanResources].[EmployeeDepartmentHistory] имеет 296 строк. Мы можем ожидать результирующий набор из 14 208, каждая комбинация строк (3 х 16 х 296 = 14 208 рядов).
--Пример 2: 3 таблицы Cross Join ВЫБЕРИТЕ d.Name как «Отдел», s.Name, h.StartDate, s.StartTime, s.EndTime ОТ [HumanResources].[Shift] s ПЕРЕКРЕСТНОЕ СОЕДИНЕНИЕ [Отдел кадров].[Отдел] d CROSS JOIN [HumanResources].[EmployeeDepartmentHistory] h ORDER BY d.Name, h.StartDate, s.StartTime ИДТИ
Пример 2 Результаты
В этом запросе, используя столбец из каждой из трех таблиц, вы можете увидеть, что результаты представляют собой каждую комбинацию строк в каждой из 3 таблиц. Показан частичный набор результатов.
SQL CROSS JOIN Пример 3. Создание отчета
Для этого примера я создам отчет, который показывает каждую смену с возможным Время начала и окончания для каждого отдела. Кроме того, я показываю тот же запрос, но с фильтр, ограничивающий результаты только финансовым отделом.
--Пример 3: отчет, показывающий каждую смену с возможным временем начала и окончания для финансового отдела ВЫБЕРИТЕ d.Name как «Отдел», s.Name, s.StartTime, s.EndTime ОТ [HumanResources].[Shift] s ПЕРЕКРЕСТНОЕ СОЕДИНЕНИЕ [Отдел кадров].[Отдел] d ЗАКАЗАТЬ ПО d.Name , s.StartTime -- Или вы можете добавить фильтр через предложение WHERE в запрос Cross Join ВЫБЕРИТЕ d.Name как «Отдел», s.Name, s.StartTime, s.EndTime ОТ [HumanResources].[Shift] s ПЕРЕКРЕСТНОЕ СОЕДИНЕНИЕ [Отдел кадров].[Отдел] d ГДЕ d.Name = 'Финансы' ЗАКАЗАТЬ ПО d.Name , s.StartTime ИДТИ
Пример 3 Результаты
3a) Результаты показывают все возможные комбинации смен в каждом отделе. Показан частичный набор результатов.
3b) Ограничено финансовым отделом, но показать все возможные комбинации Сдвиги.
SQL CROSS JOIN Пример 4. Создание большого количества данных
В качестве последнего примера я покажу, как перекрестное соединение между двумя большими таблицами может дают очень большой набор результатов. Я присоединюсь к [Production].[Product] таблица, которая имеет 504 строки с представлением [Продажи].[vIndividualCustomer], которое имеет 18 508 записи клиентов. Я вставляю результаты во временную таблицу #Temp1, которая будет 9328 032 строки. (504 х 18 508 = 9 328 032).
--Пример 4: Создание большого количества тестовых данных!! ВЫБЕРИТЕ c.BusinessEntityID, c.LastName, p.ProductID, p.ProductNumber, p.Name, p.ListPrice в #Temp1 ИЗ [Производство].[Продукт] п ПЕРЕКРЕСТНОЕ СОЕДИНЕНИЕ [Продажи].[vИндивидуальныйКлиент] c --(затронуто 9328032 строки)
Пример 4 Результаты
Я не буду показывать этот большой набор результатов, но не стесняйтесь попробовать это на своем собственный.
Следующие шаги
Надеюсь, вам был интересен этот совет о перекрестных соединениях. я редко использовали кросс-джойны и лишь изредка сталкивались с кросс-джойнами в коде. Однако, они могут быть полезны время от времени. Затем ознакомьтесь с некоторыми другими советами по другим SQL-соединения.
- Начало работы с ВНУТРЕННЕЕ СОЕДИНЕНИЕ SQL
- Узнать о Примеры правого соединения
- Подробнее о СОЕДИНЕНИЯХ: Примеры SQL LEFT JOIN
- Читать о другом Пример присоединения к SQL Server
- Узнать о ПОЛНОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ SQL с примерами
- Узнать о Пример подзапроса SQL Server
- Узнать о Присоединяйтесь к таблицам SQL Server, в которых столбцы содержат значения NULL
- Посетите Microsoft, чтобы узнать, как скачать образцы баз данных
Об авторе
Джим Эванс в настоящее время является ИТ-менеджером Crowe, который более 20 лет руководил группами администраторов баз данных, разработчиков, специалистов по бизнес-аналитике и управлению данными.Посмотреть все мои советы
Последнее обновление статьи: 2021-10-28
Как использовать перекрестные соединения SQL. Соединение SQL, о котором вы никогда не знали | Мэдисон Шотт
Опубликовано в·
3 мин. Читать·
25 ноября 2021 г. Фото HP Koch на UnsplashЯ читал старый код и пытался переворачивать его более эффективным способом. Я встречал много странной логики, но единственной вещью, которая была мне чужда, было перекрестное соединение.
Я использовал левые соединения, правые соединения и внутренние соединения, но никогда не использовал перекрестное соединение. Я всегда ставил перед собой цель стать ниндзя SQL, поэтому, естественно, мне было любопытно, почему я никогда не слышал об этом раньше.
Когда я погуглил, что это было, я обнаружил, что это « тип соединения, который возвращает декартово произведение строк из таблиц в соединении «.
Продукт перекрестного соединения лучше всего показан на картинке. Когда вы совместите таблицу соединения 1 с таблицей 2, вы получите что-то похожее на это.
Изображение автораЗдесь первый столбец в первой таблице соединяется с каждым столбцом во второй таблице, создавая три новые строки со следующими комбинациями:
- 1 и 1
- 1 и 2
- 1 и 3
Итак, для каждой строки в таблице 2 это значение объединяется с каждым значением в таблице 1.
Когда я думаю об этом выводе, я думаю о классическом комбинированная задача на уроке статистики. Сколько различных комбинаций носков вы можете составить, если вам разрешено брать с собой в отпуск только две пары и есть возможность трех разных цветов?
Изображение автораКаждую красную пару можно соединить с синей или зеленой парой. Для каждой зеленой пары вы можете соединить ее с синей или красной парой. Каждую синюю пару можно соединить с красной или зеленой парой. Это похоже на результат перекрестного соединения!
Давайте посмотрим на настоящий SQL-запрос. Допустим, у нас есть две разные таблицы, которые представляют имена детей в классе. Одна с именами девочек, другая с именами мальчиков.
Изображение автораВЫБЕРИТЕ
девочки.имя,
мальчики.имя
ОТ девочек
ПЕРЕКРЕСТНОЕ СОЕДИНЕНИЕ мальчиков
При перекрестном соединении таблицы девочек с таблицей мальчиков и выборе имени из обеих таблиц вы получите вывод, который выглядит следующим образом: этот.
Изображение автораВы можете видеть, что имя каждой девочки сочетается с именем каждого мальчика. По сути, вы создаете большой список возможных комбинаций между двумя таблицами.
При перекрестных соединениях вы также можете включить предложение where
, указывающее некоторый тип условия соединения. Это наиболее распространено при работе с числовыми столбцами.
ВЫБЕРИТЕ
schedule.event,
calendar.number_of_days
FROM schedule
CROSS JOIN calendar
WHERE schedule.total_number < calendar.number_of_days
Здесь запрос только соединит строку в расписании 901 43 таблицы со строками в
календарь
таблица, удовлетворяющая заданному условию.