查询以查找丢失的师生组合

时间:2019-07-20 09:56:22

标签: sql oracle

我有一个包含两列TEACHER_ID和STUDENT_ID的表格,其中包含所有教学生的老师的数据。一位老师可以教多位学生,一位学生可以由多位老师教。

TEACHER_ID  STUDENT_ID
100         123    
100         124    
100         125    
100         126    
101         123    
101         124    
101         125    
102         123    
102         124    
102         125    
102         126    
103         123    
103         127

需要找到哪个老师不在教哪个学生,即它应该将输出显示为相同的两列,但输出对应该在表中不存在。

例如:student_id 127由单独的Teacher_id 103教,并且类似地针对所有此类缺失对...

我们可以创建一个交叉连接以获取所有可能的组合,并使用MINUS运算符丢弃结果中的实际数据,剩下其余对。

但是有没有更好,更有效的方法呢?

2 个答案:

答案 0 :(得分:2)

关于您的问题。您需要先创建所有组合,然后再找到丢失的对。

SQL DEMO

With teachers as (
     SELECT DISTINCT "TEACHER_ID" 
     FROM Table1  
), students as (
     SELECT DISTINCT "STUDENT_ID"
     FROM Table1  
)  
SELECT teachers."TEACHER_ID" , students."STUDENT_ID"
FROM  teachers
CROSS JOIN students
LEFT JOIN Table1 t
  ON teachers."TEACHER_ID" = t."TEACHER_ID" 
 AND students."STUDENT_ID"  = t."STUDENT_ID"
 WHERE t."TEACHER_ID" IS NULL
ORDER BY 2, 1

答案 1 :(得分:0)

您可以通过使用cross join生成师生的所有组合来做到这一点。然后过滤掉存在的那些

select t.teacher_id, s.student_id
from (select distinct teacher_id from t) t cross join
     (select distinct student_id from t) s
minus
select t.teacher_id, s.student_id
from t;

对于过滤部分,您还可以使用not innot existsleft join / where