sql - Oracle SQL 有没有办法在数据集数量动态时找到存储在同一个表中的数据集的交集

标签 sql oracle relational-division

想象一下下面的数据集。 (这不是我正在处理的完全相同的问题,但这只是一个演示需求的简单示例)

Student ID,  Course ID
S1           C1
S1           C2
S1           C3
S2           C1
S2           C3
S3           C1
S3           C2

在上面的数据集中,每个学生都在类(class)数量下注册。我想找出哪些学生正在处理此表中的所有原因。

因此,如果我使用 INTERSECT 关键字,它将看起来像这样。

SELECT student_id FROM <table> where course_id = 'C1'
INTERSECT
SELECT student_id FROM <table> where course_id = 'C2'
INTERSECT
SELECT student_id FROM <table> where course_id = 'C3'

显然只有在类(class)列表固定的情况下才有效。

有没有一种方法可以做到这一点,类(class)列表是动态的并且只使用 SQL。

我可以编写一个 PLSQL 函数来执行此操作。但是随后将为每个唯一的类(class) ID 执行一个游标,交集将由 PLSQL 代码完成。

我正在寻找是否可以将尽可能多的数据卸载到 SQL 引擎(可能使用分析函数),因为涉及的数据集可能很大。

最佳答案

尝试这样的事情:

SELECT student_id FROM <table> 
WHERE course_id IN (SELECT course_id FROM <anothertable>) 
GROUP BY student_id 
HAVING COUNT(DISTINCT course_id)=(SELECT COUNT(DISTINCT course_id) FROM <anothertable>)

这样,您可以确保每个返回 student_id为每个 course_id 注册在 <anothertable> 中指定.

这称为“关系部门”,另请参阅 https://www.red-gate.com/simple-talk/sql/t-sql-programming/divided-we-stand-the-sql-of-relational-division/

编辑(戈登):

问题中只提到了一张表,所以查询是:

SELECT student_id
FROM t
GROUP BY student_id 
HAVING COUNT(DISTINCT course_id) = (SELECT COUNT(DISTINCT course_id) FROM t)

关于sql - Oracle SQL 有没有办法在数据集数量动态时找到存储在同一个表中的数据集的交集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56881175/

相关文章:

mysql - 仅当我重新声明数据类型时,修改才有效吗?

sql - 使用嵌套循环提高 SQL 查询的性能 - PostgreSQL

c# - 检查 Oracle.DataAccess 是否存在

sql - oracle sql date不迟于今天

mysql - 如何在MySql中返回具有相同列值的行

mysql - 在不同的行上选择满足不同条件的值?

sql - 如何从 sql 中的临时 #date 表中选择之前的日期?

mysql - 遇到 "unknown tablefield"但已定义

java - Spring JDBC 支持和大型数据集

sql - 关系代数 - 恰好找到两个值