Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

просто случайный пример. у вас есть таблица городов: 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

Ответ 2

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

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

 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

Ответ 3

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

В 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

Ответ 4

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

Ответ 5

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

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

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

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

Ответ 6

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

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

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

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

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

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

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

Ответ 7

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

Ответ 8

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