Цель этого упражнения - избежать совокупных операторов или группировок. Это будет хорошей демонстрацией того, почему они полезны.
Итак, вы говорите, что для каждого id_ship
в данной таблице может быть 3, 2 или 1 вхождения. Предположительно для вашего «тройного декартова произведения» (который будет самостоятельным продуктом с переименованием) вы собираетесь создать строку с тремя датами, восходящими слева направо (чтобы вы могли убедиться, что сам продукт не дублируется)даты).
Хорошо, тогда для случаев с двумя случаями вам нужно двойное декартово произведение, даты возрастают слева направо. Исключите те id-ship
s, которые уже появляются в тройках.
Для случая 1 случая исключите те id-ship
s, которые появляются в любом из вышеперечисленных.
Затем UNION
вместе три результата:
SELECT id-ship, 3 AS count
FROM occ3
UNION
SELECT id-ship, 2 AS count
FROM occ2
UNION
SELECT id-ship, 1 AS count
FROM occ1 ;
Теперь у вас есть обычная таблица в групповом стиле с подсчетом.
Ах, но вы хотели, чтобы RA неSQL? Затем мы сталкиваемся с трудностями какой версии RA. Версии отличаются тем, какие операторы доступны. И, например, версия «дедушки» Codd 1972 даже не включала переименование, поэтому вы даже не могли создать этот тройной декартовой продукт.
Все версии поддерживают UNION
OK;все проекции поддержки, что вам нужно для получения id-ship
из трех отдельных результатов запроса.
Предположим, что ваш RA поддерживает литералы отношения: {{count 3}}
- это (одноэлементный) набор кортежей, каждый кортежбудучи набором пар имя-значение атрибута
(pi<id-ship>(occ3) x {{count 3}})
UNION
(pi<id-ship>(occ2) x {{count 2}})
UNION
(pi<id-ship>(occ1) x {{count 1}})
Если ваш RA не поддерживает литералы отношения, он может поддерживать операцию EXTEND