Вопрос

Перекрестное соединение выполняет декартово произведение кортежей двух наборов.

SELECT *
FROM Table1
CROSS JOIN Table2

Какие обстоятельства делают такую операцию SQL особенно полезной?

Это было полезно?

Решение

Если у вас есть "сетка", которую вы хотите заполнить полностью, например, информация о размере и цвете определенного предмета одежды:

select 
    size,
    color
from
    sizes CROSS JOIN colors

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

select
    hour,
    minute
from
    hours CROSS JOIN minutes

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

select
    specId,
    month
from
    reports CROSS JOIN months

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

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

Другие советы

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

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

Генерируйте данные для тестирования.

Ладно, это, вероятно, не ответит на вопрос, но, если это правда (а я даже в этом не уверен), это забавный эпизод из истории.

На заре Oracle один из разработчиков понял, что ему нужно дублировать каждую строку в таблице (например, возможно, это была таблица событий, и ему нужно было изменить в ней отдельные записи "начальное событие" и "конечное событие").Он понял, что если бы у него была таблица всего с двумя строками, он мог бы выполнить перекрестное соединение, выбрав только столбцы в первой таблице, и получить именно то, что ему было нужно.Поэтому он создал простую таблицу, которую вполне естественно назвал "ДВОЙНОЙ".

Позже ему нужно было сделать что-то, что можно было сделать только с помощью выбора из таблицы, хотя само действие не имело никакого отношения к таблице (возможно, он забыл свои часы и хотел узнать время с помощью ВЫБОРА SYSDATE ИЗ ...), Он понял, что у него все еще есть его ДВОЙНАЯ таблица, и использовал это.Через некоторое время ему надоело видеть время, напечатанное дважды, поэтому в конце концов он удалил одну из строк.

Другие сотрудники Oracle начали использовать его таблицу, и в конце концов было решено включить ее в стандартную установку Oracle.

Это объясняет, почему таблица, единственное значение которой заключается в том, что в ней есть одна строка, имеет имя, которое означает "две".

Ключ - "покажи мне все возможные комбинации".Я использовал их в сочетании с другими вычисляемыми полями, а затем отсортировал / отфильтровал их.

Например, допустим, вы создаете арбитражное (торговое) приложение.У вас есть продавцы, предлагающие товары по определенной цене, и покупатели, запрашивающие товары по определенной стоимости.Вы выполняете перекрестное объединение по ключу продукта (чтобы сопоставить потенциальных покупателей и продавцов), вычисляете разброс между себестоимостью и ценой, затем сортируете desc.на это, чтобы предоставить вам (посреднику) наиболее выгодные сделки для исполнения.Конечно, почти всегда у вас будут другие ограничивающие критерии фильтрации.

Принимает что-то вроде таблицы цифр, в которой есть десять строк для цифр 0-9.Вы можете использовать перекрестное объединение в этой таблице несколько раз, чтобы получить результат, содержащий столько строк, сколько вам нужно, с соответствующей нумерацией результатов.Это имеет несколько применений.Например, вы можете объединить его с функцией datadd(), чтобы получить набор для каждого дня в данном году.

Это интересный способ использовать перекрестное соединение для создайте отчет по перекрестной таблице.Я нашел это в SQL Джо Селко Для умников, и использовали его несколько раз.Это действительно требует небольшой настройки, но стоило затраченного времени.

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

вы можете использовать это ПЕРЕКРЕСТНОЕ СОЕДИНЕНИЕ Для:- генерировать данные для целей тестирования - комбинировать все свойства - вам нужны все возможные комбинации, например, групп крови (A, B, ..) с Rh-/ + и т.д...--настройте его для своих целей;) - Я не специалист в этой области;)

CREATE TABLE "HR"."BL_GRP_01" 
("GR_1" VARCHAR2(5 BYTE));
REM INSERTING into BL_GRP_01
SET DEFINE OFF;
Insert into BL_GRP_02 (GR_1) values ('A');
Insert into BL_GRP_02 (GR_1) values ('B');
Insert into BL_GRP_02 (GR_1) values ('O');
Insert into BL_GRP_01 (GR_1) values (NULL);

CREATE TABLE "HR"."BL_GRP_02" 
("GR_1" VARCHAR2(5 BYTE));

REM INSERTING into BL_GRP_02
SET DEFINE OFF;
Insert into BL_GRP_02 (GR_1) values ('A');
Insert into BL_GRP_02 (GR_1) values ('B');
Insert into BL_GRP_02 (GR_1) values ('O');
Insert into BL_GRP_02 (GR_1) values (NULL);

CREATE TABLE "HR"."RH_VAL_01" 
("RH_VAL" VARCHAR2(5 BYTE));
REM INSERTING into RH_VAL_01
SET DEFINE OFF;
Insert into RH_VAL_01 (RH_VAL) values ('+');
Insert into RH_VAL_01 (RH_VAL) values ('-');
Insert into RH_VAL_01 (RH_VAL) values (NULL);

select distinct  a.GR_1 || b.GR_1 || c.RH_VAL as BL_GRP
from BL_GRP_01 a, BL_GRP_02 b, RH_VAL_01 c
GROUP BY a.GR_1, b.GR_1, c.RH_VAL;
  • создайте соединение для 2 таблиц без общего идентификатора, а затем сгруппируйте его с помощью max() и т.д..чтобы найти максимально возможную комбинацию
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top