SQL仅针对一种类型返回行

时间:2019-02-26 06:55:05

标签: sql sql-server

我不确定要在标题中加上什么。我有一个 SCHOOL表,带有:

id, 
name,
type_id

列。

SCHOOL_STUDENT表,其中:

school_id,
student_id


和一个SCHOOL_TYPE表,

id, 
name

列。

学生可以在多所学校注册。一所学校只能是一种类型。给我一个学生,我想检查他/她是否入学了仅类型(高学校)类型的学校,而没有其他学校。我想检查学生是否入学了仅类型(高学校)类型的学校,而没有其他学校。如果一个学生入读了两所学校,其中一所是高中,其中一所是技术学校,那么我想要一些否定的指示。如果这两所学校都是高中,我希望有积极的迹象。假设SCHOOL_TYPE的一行ID为3,名称为“ high school”。

样本数据:

学校表格 id:name:type_id

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

SCHOOL_TYPE表 id:名称

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

SCHOOL_STUDENT表: school_id:学生编号

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

请参阅学生ID:123被两所学校注册,其ID:1和ID:3。这些学校都是类型:3,这意味着我想要成功的结果。如果同一名学生注册的学校不止一所,而这些学校也属于其他类型(typeID:3除外),那么我想失败。

学生ID:123的预期输出为“是”,而学生ID: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

可以使用HAVING吗?还是CASE?

问题已更新:

2 个答案:

答案 0 :(得分:0)

您可以将关联子查询与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

答案 1 :(得分:0)

这是最少的查询。如有必要,请与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