sql - 查询查找缺失的师生组合

标签 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 运算符丢弃结果中的实际数据,留下其余的对。

但是有没有更好、更有效的方法来做到这一点?

最佳答案

至于你的问题。您需要首先创建所有组合,没有其他方法可以找到丢失的对。

<强> 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/

相关文章:

java - Hibernate 公式与一对多关系

mysql - 使用 MySQL for Excel - 数据库中的一个特定表将无法导入,所有其他表都工作正常

sql - 获取 child 关系的计数和 child 的 child 的计数

连接 Oracle 和 MS SQL Server 的 SQL 语句

c# - NHibernate seqhilo 如何生成 id?

相当于 foreach 循环的 Oracle PL

MySQL 中的 PHP "Nested"事务可以使用以下代码实现吗?

sql - MySQL View - 何时使用和何时不使用

sql - 在 sql server 2008 中使用最小匹配条件运行 SQL 查询

Oracle SQL sqlldr 不将纬度/经度导入为 float