2008-10-20 3 views
79

Перекрестное соединение выполняет декартово произведение на кортежах двух наборов.Каковы преимущества использования Cross Join?

SELECT * 
FROM Table1 
CROSS JOIN Table2 

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

+19

Очень грустно, что этот вопрос был закрыт. Я думаю, что это может быть отмечено Community Wiki, но сказать, что это неконструктивно несправедливо. – 2016-02-09 03:15:31

+0

Согласен. Это ответ на точный вопрос, который у меня был. – Hades 2017-08-04 15:08:59

ответ

71

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

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

12

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

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

7

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

1

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

9

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

В ранние дни Oracle один из разработчиков понял, что ему нужно дублировать каждую строку в таблице (возможно, это была таблица событий, и ему нужно было изменить ее «start event» и «end event») , Он понял, что если бы у него был стол всего двумя рядами, он мог бы сделать крест, выбрав только столбцы в первых двух, и получить именно то, что ему нужно. Поэтому он создал простую таблицу, которую он, естественно, назвал «DUAL».

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

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

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

3

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

5

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

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

2

Это интересный способ использования перекрестного соединения с create a crosstab report. Я нашел его в Joe Celko's SQL For Smarties и использовал его несколько раз. Это требует немного настройки, но стоило потраченного времени.

Смежные вопросы