2016-02-10 17 views
0

所以可以說我有這些表:需要幫忙給定表的所有事件 - 的Oracle SQL

Students 
-------- 
code_student (pk) 
name 
address 

Teacher 
-------- 
code_teacher (pk) 
name 
address 

Class 
--------- 
code_class (pk) 
description 


History 
---------- 
code_student (pk)(fk) 
code_class  (pk)(fk) 
code_teacher (pk)(fk) 
year 
grade 

,我想誰參加定教授所有類的學生。我一直在使用這種方法:

select code_student,name 
from student s 
where not EXISTS (
      select code_teacher 
      from teacher t 
      where t.name like 'John Smith' AND not EXISTS (
              select code_teacher 
              from history h 
              where t.code_teacher = h.code_teacher 
              and s.code_student = h.code_student)); 

使用我的老師(雙嵌套查詢與不存在的),但我似乎無法正確看着辦吧。任何幫助,將不勝感激

回答

0

這樣做的另一種方法,這是更加可擴展的,因爲它允許您一次獲得多個教師的結果,並會找到每個老師的所有學生已採取他們的所有課程。

你只是希望看到一個學生與老師在一起的獨特班級數量與老師提供的獨特班級數量相匹配。就我個人而言,我發現這種方法也更清楚一些。關於計數的DISTINCT對於多年提供同一班級的老師和/或不止一次參加同一班級的學生來說是必要的。

SELECT 
    S.code_student, 
    S.name AS student_name, 
    T.code_teacher, 
    T.name AS teacher_name 
FROM 
    Student S 
INNER JOIN Teacher T ON T.name = 'John Smith' 
INNER JOIN History H ON 
    H.code_student = S.code_student AND 
    H.code_teacher = T.code_teacher 
INNER JOIN 
(
    SELECT code_teacher, COUNT(DISTINCT code_class) AS cnt 
    FROM History 
    GROUP BY code_teacher 
) SQ ON 
    SQ.code_teacher = T.code_teacher 
GROUP BY 
    S.code_student, 
    S.name AS student_name, 
    T.code_teacher, 
    T.name AS teacher_name, 
    SQ.cnt 
HAVING 
    COUNT(DISTINCT H.code_class) = SQ.cnt 
0

這是一個Oracle數據庫嗎?您可以使用分析函數在沒有子查詢的情況下執行此操作。

SELECT distinct student_name, teacher_name FROM 
(
    SELECT s.name student_name, 
      t.name teacher_name, 
      count(DISTINCT h.code_class) OVER (PARTITION BY h.code_teacher) classes_taught_by_teacher, 
      count(DISTINCT h.code_class) OVER (PARTITION BY h.code_teacher, h.code_student) teacher_classes_taken_by_stu 
    FROM history h 
    INNER JOIN students s ON s.code_student = h.code_student 
    INNER JOIN teacher t on t.code_teacher = h.code_teacher 
    WHERE t.name = 'John Smith') 
WHERE teacher_class_taken_by_stu = classes_taught_by_teacher