我有一个包含两列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运算符丢弃结果中的实际数据,剩下其余对。
但是有没有更好,更有效的方法呢?
答案 0 :(得分:2)
关于您的问题。您需要先创建所有组合,然后再找到丢失的对。
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 in
,not exists
或left join
/ where
。