Где в реальной жизни используются декартовы объединения? - PullRequest
13 голосов
/ 04 марта 2010

Где в реальной жизни используются декартовы объединения?

Кто-нибудь может привести примеры такого объединения в любой базе данных SQL.

Ответы [ 8 ]

13 голосов
/ 04 марта 2010

просто случайный пример. у вас есть таблица городов: Id, Lat, Lon, Name. Вы хотите показать пользователю таблицу расстояний от одного города до другого. Вы напишите что-то вроде

SELECT c1.Name, c2.Name, SQRT( (c1.Lat - c2.Lat) * (c1.Lat - c2.Lat) + (c1.Lon - c2.Lon)*(c1.Lon - c2.Lon))
FROM   City c1, c2
3 голосов
/ 04 марта 2010

Вот два примера:

Чтобы создать несколько копий счета-фактуры или другого документа, вы можете заполнить временную таблицу именами копий, а затем декартово объединить эту таблицу с фактическими записями счета-фактуры. Набор результатов будет содержать одну запись для каждой копии счета-фактуры, включая «имя» копии для печати на полосе вверху или внизу страницы или в виде водяного знака. Используя эту технику, программа может предоставить пользователю флажки, позволяющие им выбирать, какие копии печатать, или даже разрешить им печатать «специальные копии», в которых пользователь вводит имя копии.

 CREATE TEMP TABLE tDocCopies (CopyName TEXT(20))
 INSERT INTO tDocCopies (CopyName) VALUES ('Customer Copy')
 INSERT INTO tDocCopies (CopyName) VALUES ('Office Copy')
 ...
 INSERT INTO tDocCopies (CopyName) VALUES ('File Copy')
 SELECT * FROM InvoiceInfo, tDocCopies WHERE InvoiceDate = TODAY()

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

  SELECT People.PeopleID, People.Name, CalDates.CalDate
     FROM People, CalDates
2 голосов
/ 16 февраля 2013

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

1 голос
/ 04 марта 2010

Обычно для создания надмножества для отчетов.

В PosgreSQL:

SELECT  COALESCE(SUM(sales), 0)
FROM    generate_series(1, 12) month
CROSS JOIN
        department d
LEFT JOIN
        sales s
ON      s.department = d.id
        AND s.month = month
GROUP BY
        d.id, month
0 голосов
/ 25 января 2014

Для создания списка связанных слов в интеллектуальном анализе текста, используя функции сходства, например, Редактировать расстояние

0 голосов
/ 14 июля 2010

При выполнении запроса для каждой даты в заданном диапазоне. Например, для веб-сайта вам может потребоваться узнать за каждый день, сколько пользователей было активным за последние N дней. Вы можете выполнить запрос для каждого дня в цикле, но проще всего сохранить всю логику в одном запросе, а в некоторых случаях БД может оптимизировать декартово объединение.

0 голосов
/ 14 июля 2010

Это единственный раз в моей жизни, когда я нашел законное применение для декартового произведения.

В последней компании, в которой я работал, был отчет, который запрашивался ежеквартально, чтобы определить, какие часто задаваемые вопросы использовались в каждом географическом регионе для национального веб-сайта, над которым мы работали.

Наша база данных описывает географические регионы (рынки) кортежем (4, x), где 4 представляет номер уровня в иерархии, а x представляет уникальный marketId.

Каждый FAQ обозначается FaqId, а каждая связь с FAQ определяется составным ключом marketId tuple и FaqId. Связи устанавливаются через приложение администратора, но, учитывая, что в системе имеется 1000 часто задаваемых вопросов и 120 рынков, было сложно установить начальные ассоциации всякий раз, когда создавался новый FAQ. Итак, мы создали выбор рынка по умолчанию и изменили кортеж marketId на (-1,-1), чтобы представить это.

Назад к отчету - отчет должен был отображать каждый вопрос / ответ на часто задаваемые вопросы и рынки, на которых этот FAQ отображался в 2D-матрице (мы использовали электронную таблицу Excel). Я обнаружил, что проще всего связать каждый FAQ с каждым рынком в случае выбора рынка по умолчанию с помощью этого запроса, объединив разбитый результат со всеми другими прямыми ассоциациями FAQ-market.

Таблица Faq2LevelDefault содержит все рынки, которые определены как выбранные по умолчанию (я думаю, что это был просто список идентификаторов рынков).

SELECT FaqId, fld.LevelId, 1 [Exists]
FROM Faq2Levels fl
  CROSS JOIN Faq2LevelDefault fld
WHERE fl.LevelId=-1 and fl.LevelNumber=-1 and fld.LevelNumber=4
UNION
SELECT Faqid, LevelId, 1 [Exists] from Faq2Levels WHERE LevelNumber=4
0 голосов
/ 30 марта 2010

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

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

select severity_name, priority_name, count(*)
from (select severity_id, severity_name, 
             priority_id, priority_name 
        from severity, priority) sp 
      left outer join 
      errors e 
      on e.severity_id = sp.severity_id 
         and e.priority_id = sp.priority_id
group by severity_name, priority_name

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...