Что пользы для перекрестного соединения? [закрытый]


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

SELECT *
FROM Table1
CROSS JOIN Table2

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

8 87

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.