选择具有不同条件的不同行的值?

时间:2014-12-23 21:50:30

标签: sql relational-division

这是关于如何在Meta上使用RDBMS作为的结果执行this discussion的规范性问题。如果您需要添加更多信息,请不要发布新答案,而是编辑社区维基答案。


考虑下表:

| student | course  |
+---------+---------+
|  Adam   | Math    |
|  Adam   | Science |
|  John   | Math    |
|  John   | Science |
|  Jane   | Math    |
|  Jane   | Physics |

我想吸引所有正在学习数学和科学的学生。这意味着应该归还亚当和约翰。

3 个答案:

答案 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'

请参阅http://sqlfiddle.com/#!4/b637c7/3

答案 2 :(得分:0)

在Oracle,SQL Server和Postgresql中,您可以使用intersect集合运算符:

select student from tbl where course = 'Math'
intersect
select student from tbl where course = 'Science'