SQL: вложенный запрос с помощью конструктора кортежей - PullRequest
0 голосов
/ 23 апреля 2020

У меня есть некоторые трудности, связанные с упражнением SQL для моего курса «Введение в базу данных». Стандарт SQL, который мы в основном используем, это Oracle (тот, который совместим с Apex).

У меня есть следующая база данных SQL (первичные ключи полужирный ):

TEENAGER ( SSN , имя, фамилия, дата рождения, CityOfResidence, пол)

ACTIVITY ( ActivityCode , AName, описание, категория)

SUMMER-CAMP ( CampCode , CampName, City)

ПОДПИСКА НА ACTIVITY-IN-SUMMER-CAMP ( SSN, ActivityCode, CampCode, SubscriptionDate )

Вот что спрашивает упражнение:

"Для каждого подростка, родившегося до 2005 года, который подписался на мероприятия, организованные по крайней мере в 5 различных летних лагерях, с указанием имени, фамилии, рождения дата подростка и название каждого летнего лагеря, на который подросток подписывался на все различные мероприятия, организованные лагерем. "

У меня нет проблем с поиском SSN подростков, родившихся до этого 2005 и кто подписался как минимум на 5 лагерей, и я могу найти количество различных мероприятий, организованных лагерем. Как мне удается использовать эту информацию, чтобы найти окончательный результат?

Теперь это моя попытка решения (я добавил два встроенных комментария с "#" для ясности):

FROM TEENAGER T, SUMMER-CAMP SC, SUBSCRIPTION-TO-ACTIVITY-IN-SUMMER-CAMP STAISC
WHERE T.SSN = STAISC.SSN AND STAISC.CampCode = SC.CampCode
    AND SSN IN (SELECT T.SSN #born before 2005 and at least 5 camps
                    FROM TEENAGER T, SUBSCRIPTION-TO-ACTIVITY-IN-SUMMER-CAMP STAISC
                    WHERE T.BirthDate < TO_DATE('01/01/2005', 'DD/MM/YYYY')
                            AND T.SSN = STAISC.SSN
                    GROUP BY T.SSN
                    HAVING COUNT(DISTINCT STAISC.CampCode) > 4)
GROUP BY STAISC.CampCode, T.SSN
HAVING (STAISC.CampCode, COUNT(DISTINCT ActivityCode)) IN (SELECT CampCode, COUNT(DISTINCT ActivityCode) #number of activities in camps
                                                            FROM SUBSCRIPTION-TO-ACTIVITY-IN-SUMMER-CAMP
                                                            GROUP BY CampCode)```

Как видите, я использую конструктор кортежей в самом внешнем запросе в предложении HAVING, чтобы попытаться использовать информацию об общем количестве мероприятий, организованных в лагере. Могу ли я это сделать и сработает ли это? (Профессор не предоставил нам никакой базы данных, поскольку на экзамене мы должны будем записать запрос, не имея возможности его выполнить).

Заранее спасибо!

1 Ответ

0 голосов
/ 23 апреля 2020

Я отвечаю на свой вопрос, так как нашел правильное решение:

SELECT T.SSN, SC.CampCode, T.Name, T.Surname, T.BirthDate, SC.CampName
FROM TEENAGER T, SUMMER-CAMP SC, SUBSCRIPTION-TO-ACTIVITY-IN-SUMMER-CAMP STAISC
WHERE BirthDate < TO_DATE('01/01/2005', 'DD/MM/YYYY')
    AND T.SSN = STAISC.SSN AND STAISC.CampCode = SC.CampCode
    AND T.SSN IN(SELECT SSN FROM SUBSCRIPTION-TO-ACTIVITY-IN-SUMMER-CAMP
                    GROUP BY SSN
                    HAVING COUNT(DISTINCT CampCode))
GROUP BY T.SSN, SC.CampCode
HAVING COUNT(DISTINCT STAISC.ActivityCode) = (SELECT COUNT(ActivityCode)
                                                FROM SUBSCRIPTION-TO-ACTIVITY-IN-SUMMER-CAMP STAISC2
                                                WHERE STAISC.CampCode = STAISC2.CampCode)
...