帮我写一个sql语句来做这样的事情

时间:2010-03-06 15:06:56

标签: sql database oracle hibernate

您还可以编写hibernate hql或条件查询。

我有像这样的教师实体和学生实体:

class Teacher {
     public Long id ;
     public Set<Student> students;
} 

class Student {
    public Long id ;
    public Teacher teacher ;
    public Boolean passedSemester1;  
    public Boolean passedSemester2; 
}

您可以假设我的表格具有以下结构。

老师和学生有一对一的双向关系。 学生表管理外键。

我需要找出那些学生都通过第一学期和第二学期的教师。 其实我也需要搜索:

所有未能通过第一学期和第二学期, 全部通过了第一学期但未通过第二学期, 所有都未通过第一学期,但通过了第二学期。

您可以编写任何一个查询,其他查询应该没有太大差异。

为了不引起其他误解,我将我的真实问题抽象为这个简单的问题。我需要加入这两个表来进行其他复杂的查询,因此查询学生表并不容易。

谢谢!

1 个答案:

答案 0 :(得分:1)

在SQL中,找到学生都通过了两个学期的老师:

SELECT teacher_id
FROM student
GROUP BY teacher_id
HAVING MIN(passed_semester_1) AND MIN(passed_semester_2)

结果:

1
4

找到学生都通过第一学期的教师,但并非所有学生都通过第二学期:

SELECT teacher_id
FROM student
GROUP BY teacher_id
HAVING MIN(passed_semester_1) AND NOT MIN(passed_semester_2)

结果:

2

更新加入演示:

SELECT T2.*
FROM (
    SELECT teacher_id
    FROM student
    GROUP BY teacher_id
    HAVING MIN(passed_semester_1) AND MIN(passed_semester_2)
) AS T1
JOIN teacher AS T2 ON T1.teacher_id = T2.teacher_id

使用此表结构和测试数据:

CREATE TABLE student (student_id INT NOT NULL, teacher_id INT NOT NULL, passed_semester_1 INT NOT NULL, passed_semester_2 INT NOT NULL);
INSERT INTO student (student_id, teacher_id, passed_semester_1, passed_semester_2) VALUES
(1, 1, 1, 1),
(2, 1, 1, 1),
(3, 1, 1, 1),
(4, 2, 1, 1),
(5, 2, 1, 0),
(6, 2, 1, 1),
(7, 3, 0, 1),
(8, 3, 1, 1),
(9, 4, 1, 1);