这是关于如何在Meta上使用RDBMS作为relational-division的结果执行this discussion的规范性问题。如果您需要添加更多信息,请不要发布新答案,而是编辑社区维基答案。
考虑下表:
| student | course |
+---------+---------+
| Adam | Math |
| Adam | Science |
| John | Math |
| John | Science |
| Jane | Math |
| Jane | Physics |
我想吸引所有正在学习数学和科学的学生。这意味着应该归还亚当和约翰。
答案 0 :(得分:2)
由学生分组,只考虑那些有两门课程的学生
select student
from your_table
where course in ('math','science')
group by student
having count(distinct course) = 2
答案 1 :(得分:1)
此类操作称为relational division,可以定义为CROSS JOIN
操作的反转。有各种解决方案来解决这个问题。其中一些可能依赖于您的RDBMS。没有特别的顺序:
IN
运算符一种解决方案是使用IN
运算符编写子查询。首先选择所有正在学习数学的学生的名单,并确保学生IN
列出所有学习科学的学生,如:
SELECT student
FROM enrollment
WHERE course = 'Math'
AND student IN(
SELECT student
FROM enrollment
WHERE course = 'Science');
JOIN
SELECT "student"
FROM T t1 JOIN T t2 USING("student")
WHERE t1."course" = 'Math'
AND t2."course" = 'Science'
答案 2 :(得分:0)
在Oracle,SQL Server和Postgresql中,您可以使用intersect
集合运算符:
select student from tbl where course = 'Math'
intersect
select student from tbl where course = 'Science'