我有一张桌子,我想过滤同一张桌子的结果。这是一个样本。
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,但没有运气。
请帮忙。感谢。
答案 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;