Перекрестное соединение выполняет декартово произведение на кортежах двух наборов.Каковы преимущества использования Cross Join?
SELECT *
FROM Table1
CROSS JOIN Table2
Какие обстоятельства делают такую операцию SQL особенно полезной?
Перекрестное соединение выполняет декартово произведение на кортежах двух наборов.Каковы преимущества использования Cross Join?
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.
Я полагаю, что один надуманный пример, где вы, возможно, захотите, чтобы это было, если у вас есть таблица сотрудников и таблица заданий, которые нужно выполнять, и вы хотите увидеть все возможные назначения одного сотрудника на одну работу.
Сгенерировать данные для тестирования.
Представьте, что у вас была серия запросов, которые вы хотите опубликовать по определенной комбинации элементов и дат (цены, доступность и т. Д.). Вы можете загружать элементы и даты в отдельные временные таблицы, и ваши запросы пересекаются с таблицами. Это может быть более удобным, чем альтернатива перечислению элементов и дат в разделах IN, тем более что некоторые базы данных ограничивают количество элементов в предложении IN.
Хорошо, это, вероятно, не ответит на вопрос, но если это правда (и я даже не уверен в этом), это забавная история.
В ранние дни Oracle один из разработчиков понял, что ему нужно дублировать каждую строку в таблице (возможно, это была таблица событий, и ему нужно было изменить ее «start event» и «end event») , Он понял, что если бы у него был стол всего двумя рядами, он мог бы сделать крест, выбрав только столбцы в первых двух, и получить именно то, что ему нужно. Поэтому он создал простую таблицу, которую он, естественно, назвал «DUAL».
Позже ему нужно сделать что-то, что можно было бы сделать только с помощью выбора из таблицы, хотя само действие не имело ничего общего с таблицей (возможно, он забыл свои часы и хотел прочитать время через SELECT SYSDATE FROM ...) Он понял, что у него все еще лежал его стол DUAL, и использовал это. Через некоторое время он устал видеть время, напечатанное дважды, поэтому он, в конце концов, удалил одну из строк.
Другие в Oracle начали использовать его таблицу, и в конечном итоге было принято решение включить его в стандартную установку Oracle.
Это объясняет, почему таблица, единственное значение которой имеет одна строка, имеет имя, которое означает «два».
Принимает что-то вроде таблицы цифр, которая имеет десять строк для цифр 0-9. Вы можете использовать кросс-соединение в этой таблице несколько раз, чтобы получить результат, который имеет, однако, много строк, которые вам нужны, при этом результаты нумеруются соответствующим образом. Это имеет ряд применений. Например, вы можете комбинировать его с функцией datadd(), чтобы получить набор для каждого дня в данном году.
Ключ «показать мне все возможные комбинации». Я использовал их в сочетании с другими вычисленными полями, а затем отсортировал/отфильтровал их.
Например, вы строите арбитражное (торговое) приложение. У вас есть продавцы, предлагающие продукты по цене, а покупатели просят продукты по цене. Вы делаете крест на ключе продукта (чтобы соответствовать потенциальным покупателям и продавцам), рассчитывайте спрэд между ценой и ценой, затем сортируйте desc. на этом, чтобы дать вам (посреднику) наиболее выгодные сделки для исполнения. Конечно, вы всегда будете иметь другие ограничивающие критерии фильтрации.
Это интересный способ использования перекрестного соединения с create a crosstab report. Я нашел его в Joe Celko's SQL For Smarties и использовал его несколько раз. Это требует немного настройки, но стоило потраченного времени.
Очень грустно, что этот вопрос был закрыт. Я думаю, что это может быть отмечено Community Wiki, но сказать, что это неконструктивно несправедливо. – 2016-02-09 03:15:31
Согласен. Это ответ на точный вопрос, который у меня был. – Hades 2017-08-04 15:08:59