代码之家  ›  专栏  ›  技术社区  ›  user1451111

只针对一种类型返回行的SQL

  •  0
  • user1451111  · 技术社区  · 6 年前

    我不知道该写什么标题。我有一个 SCHOOL 表,带:

    id, 
    name,
    type_id
    

    柱。

    SCHOOL_STUDENT 附表:

    school_id,
    student_id
    


    和A SCHOOL_TYPE 表与

    id, 
    name
    

    柱。

    学生可以入学 不止一所学校 . 一所学校可以 只有一种类型 . 如果有一个学生,我想检查他/她是否在只有一种类型的学校(高中)注册,而没有其他学校。我想看看这个学生是不是只上了一种类型的学校,而没有其他学校。如果一个学生在两所学校注册,其中一所是高中,其中一所是技术学校,那么我想要一些负面的暗示。如果这两所学校都是高中的话,我希望有积极的迹象。假设school_type有一行id:3,名为“high school”。

    样本数据:

    学校表 ID:名称:键入ID

    1:'abc school':3
    2:'xyz school':4
    3:'HEH school':3
    

    学校类型表 身份证:姓名

    1:'junior school'
    2:'tech school'
    3:'High school'
    

    学生桌: 学校编号:学生编号

    1,123
    3,123
    2, 56
    3, 56
    

    参见studentid:123在两所学校注册,id:1和id:3。这两所学校都是3类,这意味着我想要一个成功的结果。如果同一个学生在不止一所学校注册,并且这些学校也属于其他类型(类型ID:3除外),那么我希望失败。

    studentid:123的预期产出是肯定的,studentid:56的预期产出是否定的,因为他就读于两所学校,其中一所不是高中。

    我正在尝试,但我知道它缺少什么,但它缺少什么,我似乎没有解决。

    select
        bc.customer_id, bt.name, count(bt.[name])
    from
        school_type st 
        join school s on s.type_id = st.id
        join school_student ss on ss.school_id = s.id
    where 
        ss.student_id = 1234
    group by 
        ss.student_id, st.name
    

    有可能有用吗?还是案例?

    问题更新:

    1 回复  |  直到 6 年前
        1
  •  0
  •   Fahmi    6 年前

    可以使用相关的子查询 not exists

    select
        ss.student_id, st.name, count(bt.[name])
    from
        school_type st join school s on s.type_id = st.id
        join school_student ss on ss.school_id = s.id
    where 
        ss.student_id = 1234 and not exists (select 1 from school s1 where ss.school_id = s1.id and s1.type_id<>3)
    group by 
        ss.student_id, st.name
    
        2
  •  0
  •   Salman Arshad    6 年前

    这里是最小的查询。加入 school_type 表(如有必要):

    SELECT school_student.student_id
         , CASE WHEN COUNT(DISTINCT school.type_id) = 1 THEN 'Exactly one type' ELSE 'Multiple types' END
    FROM school_student 
    JOIN school ON school_student.school_id = school.id
    WHERE school_student.student_id = 123
    GROUP BY school_student.student_id