从Oracle中的同一个表中过滤

时间:2013-11-27 19:44:47

标签: mysql sql oracle

我有一张桌子,我想过滤同一张桌子的结果。这是一个样本。

STUDENT_ID | SCHOOL_YEAR |
-----------+-------------+
747        | 20122013    |
747        | 20132014    |
748        | 20122013    |
749        | 20122013    |
749        | 20132014    |
750        | 20122013    |
751        | 20112012    |

我想对表格进行排序,以便只有那些student_id出现在2012-2013学年而不是20132014。

所以结果将是

STUDENT_ID | 
-----------+
748        |
750        |

我试过UNION和LEFT / RIGHT JOIN,但没有运气。

请帮忙。感谢。

3 个答案:

答案 0 :(得分:3)

减号是一种简单的方法:

select student_id
from tbl
where school_year = '20122013'
minus
select student_id
from tbl
where school_year = '20132014';


STUDENT_ID
----------
       748
       750

您也可以使用“反加入”来执行此操作:

select a.student_id
from tbl a
    left outer join tbl b
        on a.student_id = b.student_id
        and b.school_year = '20132014'
where
    a.school_year = '20122013'
    and b.student_id is null;

 STUDENT_ID
 ----------
        750
        748

使用反连接,您将外部连接表的第二个副本(在此示例中为“b”),然后过滤该组中的行不匹配的位置(b.student_id为null)。

答案 1 :(得分:1)

对于非常大的数据集,您可能希望避免减号上的隐式和不必要的不​​同,并使用NOT IN或NOT EXISTS:

select student_id
from   tbl
where  school_year = '20122013' and
       student_id not in (
         select student_id
         from   tbl
         where  school_year = '20132014');

select student_id
from   tbl t1
where  school_year = '20122013' and
       not exists (
         select null
         from   tbl t2
         where  school_year = '20132014' and
                t2.student_id = t1.student_id);

如果子查询集中每个student_id可能有多行,后者会特别方便。

答案 2 :(得分:0)

就个人而言,我更喜欢minus答案,但也可以使用外连接。

SELECT t1.student_id
  FROM tbl t1
  LEFT JOIN tbl t2
    ON (t2.student_id = t1.student_id AND t2.school_year = '20132014')
 WHERE school_year = '20122013'
   AND t2.student_id IS NULL;