Перекрестное соединение выполняет декартово произведение на кортежах двух множеств.
SELECT *
FROM Table1
CROSS JOIN Table2
Какие обстоятельства делают такую операцию SQL особенно полезной?
Перекрестное соединение выполняет декартово произведение на кортежах двух множеств.
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
было частично или полностью отсутствует. В этом случае ваш администратор базы данных незамедлительно уведомит вас об упущении. Обычно он или она не будут счастливы.
Обычно вам не требуется полный декартово продукт для большинства запросов к базе данных. Вся сила реляционных баз данных заключается в том, что вы можете применять любые ограничения, которые могут вас заинтересовать, чтобы вы не могли вытащить ненужные строки из db.
Я полагаю, что один надуманный пример, где вы, возможно, захотите, чтобы это было, если у вас есть таблица сотрудников и таблица заданий, которые нужно выполнять, и вы хотите увидеть все возможные назначения одного сотрудника на одно задание.
Хорошо, это, вероятно, не ответит на вопрос, но, если это правда (и я даже не уверен в этом), это забавная история.
В первые дни существования Oracle один из разработчиков осознал, что ему нужно дублировать каждую строку в таблице (например, возможно, это была таблица событий, и ему нужно было изменить ее отдельно на "событие начала" и "событие конца"). записей). Он понял, что если бы у него была таблица с двумя строками, он мог бы выполнить перекрестное соединение, выбрав только столбцы в первой таблице, и получить именно то, что ему нужно. Поэтому он создал простую таблицу, которую он, естественно, назвал "ДВОЙНОЙ".
Позже ему нужно сделать что-то, что можно сделать только с помощью выбора из таблицы, даже если само действие не имеет ничего общего с таблицей (возможно, он забыл свои часы и хотел прочитать время с помощью SELECT SYSDATE FROM...) Он понял, что у него все еще лежал его ДВОЙНОЙ стол, и использовал это. Через некоторое время ему надоело видеть время, напечатанное дважды, поэтому он в итоге удалил один из рядов.
Другие в Oracle начали использовать его таблицу, и в конце концов было решено включить ее в стандартную установку Oracle.
Это объясняет, почему таблица, единственное значение которой состоит в том, что она имеет одну строку, имеет имя, которое означает "два".
Сгенерировать данные для тестирования.
Ключ "показать мне все возможные комбинации". Я использовал их в сочетании с другими вычисленными полями, а затем отсортировал/отфильтровал их.
Например, скажем, вы строите арбитражное (торговое) приложение. У вас есть продавцы, предлагающие продукты по цене, а покупатели просят продукты по цене. Вы делаете крест на ключе продукта (чтобы соответствовать потенциальным покупателям и продавцам), рассчитывайте спрэд между ценой и ценой, затем сортируйте desc. на этом, чтобы дать вам (посреднику) наиболее выгодные сделки для исполнения. Конечно, вы всегда будете иметь другие критерии ограничивающего фильтра.
Делает что-то вроде таблицы цифр, которая имеет десять строк для цифр 0-9. Вы можете использовать кросс-соединение в этой таблице несколько раз, чтобы получить результат, который имеет, однако, много строк, которые вам нужны, при этом результаты нумеруются соответствующим образом. Это имеет ряд применений. Например, вы можете объединить его с функцией datadd(), чтобы получить набор для каждого дня в конкретном году.
Это интересный способ использования перекрестного присоединения к создать отчет кросс-таблицы. Я нашел его в Joe Celko SQL для Smarties и использовал его несколько раз. Это требует небольшой настройки, но стоило потраченного времени.
Представьте, что у вас была серия запросов, которые вы хотите опубликовать по определенной комбинации элементов и дат (цены, доступность и т.д.). Вы можете загружать элементы и даты в отдельные временные таблицы, и ваши запросы пересекаются с таблицами. Это может быть более удобным, чем альтернатива перечисления элементов и дат в предложениях IN, тем более, что некоторые базы данных ограничивают количество элементов в предложении IN.