SQL: 带元组构造函数的嵌套查询
SQL: nested query with tuple constructor
我在处理数据库入门课程的 SQL 练习时遇到了一些困难。我们主要使用的 SQL 标准是 Oracle 标准(与 Apex 兼容的标准)。
我有以下SQL数据库(主键粗体):
TEENAGER(SSN, Name, Surname, BirthDate, CityOfResidence, Sex)
ACTIVITY(ActivityCode, AName, Description, Category)
夏令营(营地代码,营地名称,城市)
SUBSCRIPTION-TO-ACTIVITY-IN-SUMMER-CAMP(SSN,ActivityCode, CampCode,
订阅日期)
这是练习的要求:
"For each teenager, born before 2005, who subscribed to activities
organized by at least 5 different summer camps, show name, surname,
birth date of the teenager and the name of each summer camp to which
the teenager subscribed to all the different activities organized by
the camp."
我可以毫无问题地找到 2005 年之前出生且订阅了至少 5 个营地的青少年的 SSN,并且我能够找到营地组织的不同活动的数量。我如何设法使用这些信息来找到最终结果?
现在,这是我对解决方案的尝试(为了清楚起见,我添加了两个带有“#”的行内注释):
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 子句的最外层查询中使用元组构造函数来尝试使用有关营地组织的活动总数的信息。我可以这样做吗?它会起作用吗? (教授没有给我们任何数据库,因为在考试中我们将不得不写下查询而不能 运行 它)。
提前致谢!
我回答我自己的问题,因为我找到了正确的解决方案:
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)
我在处理数据库入门课程的 SQL 练习时遇到了一些困难。我们主要使用的 SQL 标准是 Oracle 标准(与 Apex 兼容的标准)。
我有以下SQL数据库(主键粗体):
TEENAGER(SSN, Name, Surname, BirthDate, CityOfResidence, Sex)
ACTIVITY(ActivityCode, AName, Description, Category)
夏令营(营地代码,营地名称,城市)
SUBSCRIPTION-TO-ACTIVITY-IN-SUMMER-CAMP(SSN,ActivityCode, CampCode, 订阅日期)
这是练习的要求:
"For each teenager, born before 2005, who subscribed to activities organized by at least 5 different summer camps, show name, surname, birth date of the teenager and the name of each summer camp to which the teenager subscribed to all the different activities organized by the camp."
我可以毫无问题地找到 2005 年之前出生且订阅了至少 5 个营地的青少年的 SSN,并且我能够找到营地组织的不同活动的数量。我如何设法使用这些信息来找到最终结果?
现在,这是我对解决方案的尝试(为了清楚起见,我添加了两个带有“#”的行内注释):
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 子句的最外层查询中使用元组构造函数来尝试使用有关营地组织的活动总数的信息。我可以这样做吗?它会起作用吗? (教授没有给我们任何数据库,因为在考试中我们将不得不写下查询而不能 运行 它)。
提前致谢!
我回答我自己的问题,因为我找到了正确的解决方案:
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)