【问题标题】:SQL: Querying within multiple records that represent the same individualsSQL:在代表同一个人的多条记录中进行查询
【发布时间】:2013-11-03 22:37:40
【问题描述】:

我获得了一个大学校友的 Access 数据库。它包含每个学生去过的学校的详细信息,特别是这些学校是公立学校还是收费学校。以下是相关表结构的简化版本:

StudentID AgeStart AgeFinish State_Fee -------------------------------------------------- --------- 23 5 10 状态 23 10 18 状态 24 6 9 状态 24 9 12 费用 24 12 18 费用

主键是 StudentID+AgeStart,因此相同学生的记录存储在多行中,例如23岁以上的学生就读于两所学校,均为公立学校。 24 名学生就读于三所学校,其中一所公立学校和两所付费学校。

我需要问一个问题:有多少人在私立/付费教育中度过了整个学业?是否可以在 SQL 中选择这些人?我很挣扎,因为学生来自世界各地,在不同年龄开始和结束学校。我需要能够说“为所有出现此 ID 的情况选择 State_paid=2 的 StudentID”。有人有什么想法吗?

【问题讨论】:

    标签: sql ms-access composite-key


    【解决方案1】:

    这将找到所有从未上过公立学校的学生。

    SELECT DISTINCT StudentID FROM alumni
    WHERE StudentID NOT IN (
        SELECT StudentID FROM alumni WHERE State_Fee = 'state'
    )
    

    【讨论】:

    • 非常感谢!这太妙了。多年来,我一直在为它烦恼。
    • @user2950853,以供将来参考,另请参阅EXISTS(非常相似)。
    • 好的,我会调查的。谢谢!
    【解决方案2】:

    回答此问题的另一种方法是使用带有having 子句的聚合。我更喜欢这种方法,因为它对于这些类型的查询更通用。 (这是集合中集合查询的示例。)

    select StudentId
    from t
    group by StudentId
    having sum(iif(State_Fee = "state", 1, 0) = 0;
    

    having 子句的作用是计算每个StudentId 出现"state" 的次数。当没有这样的记录时,StudentId 通过了测试。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-13
      • 1970-01-01
      • 2017-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多