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