SQL:在代表相同个体的多个记录中查询

时间:2013-11-03 22:37:40

标签: sql ms-access composite-key

我获得了大学校友的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的所有出现'。任何想法?

2 个答案:

答案 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通过测试。