我获得了大学校友的Access数据库。它包含每个学生去过的学校的详细信息,特别是这些学校是州还是付费学校。以下是相关表格结构的简化版本:
StudentID AgeStart AgeFinish State_Fee ----------------------------------------------------------- 23 5 10 state 23 10 18 state 24 6 9 state 24 9 12 fee 24 12 18 fee
主键是StudentID + AgeStart,因此相同学生的记录存储在多行中,例如上述23名学生就读于两所公立学校。 24名学生就读于三所学校,其中一所学校是两所学校,另外两所是学费。
我需要问一个问题:有多少人将他们的整个学校教育用于私立/付费教育?是否可以在SQL中选择这些人?我正在努力学习,因为学生来自世界各地,并开始和结束不同年龄段的学校。我需要能够说'选择StudentIDs,其中State_paid = 2表示此ID的所有出现'。任何想法?
答案 0 :(得分:1)
这将找到所有从未在州立学校就读的学生。
SELECT DISTINCT StudentID FROM alumni
WHERE StudentID NOT IN (
SELECT StudentID FROM alumni WHERE State_Fee = 'state'
)
答案 1 :(得分:1)
回答此问题的另一种方法是使用带有having
子句的聚合。我更喜欢这种方法,因为它对这些类型的查询更为通用。 (这是set-within-sets查询的示例。)
select StudentId
from t
group by StudentId
having sum(iif(State_Fee = "state", 1, 0) = 0;
having
子句正在做的是计算每个"state"
StudentId
发生的次数。当没有这样的记录时,StudentId
通过测试。