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