Каковы преимущества использования Cross Join?

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

SELECT *
FROM Table1
CROSS JOIN Table2

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

92
20 окт. '08 в 23:11
источник поделиться
8 ответов

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

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 было частично или полностью отсутствует. В этом случае ваш администратор базы данных незамедлительно уведомит вас об упущении. Обычно он или она не будут счастливы.

81
20 окт. '08 в 23:20
источник

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

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

13
20 окт. '08 в 23:15
источник

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

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

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

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

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

11
20 окт. '08 в 23:23
источник

Сгенерировать данные для тестирования.

8
20 окт. '08 в 23:19
источник

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

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

7
21 окт. '08 в 0:38
источник

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

3
20 окт. '08 в 23:43
источник

Это интересный способ использования перекрестного присоединения к создать отчет кросс-таблицы. Я нашел его в Joe Celko SQL для Smarties и использовал его несколько раз. Это требует небольшой настройки, но стоило потраченного времени.

2
21 окт. '08 в 20:18
источник

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

1
20 окт. '08 в 23:22
источник

Посмотрите другие вопросы по меткам или Задайте вопрос