我有一个包含两列的表,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 运算符丢弃结果中的实际数据,留下其余的对。
但是有没有更好、更有效的方法来做到这一点?
最佳答案
至于你的问题。您需要首先创建所有组合,没有其他方法可以找到丢失的对。
<强> 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
关于sql - 查询查找缺失的师生组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57123601/