选择具有恰好1个条目的每个组的条目

时间:2013-12-28 20:45:11

标签: sql sql-server database sql-server-2008

我正在寻找优化查询

让我向您展示一个小例子。 让我假设我有一个表有三个字段studentId, teacherId and subject作为

enter image description here

现在我想要一个物理老师只教一个学生的数据,即

enter image description here

老师 300 只教学生 3 等。

到目前为止我一直在尝试

select sid,tid from tabletesting with(nolock) 
where tid in (select tid from tabletesting with(nolock)
where subject='physics' group by tid having count(tid) = 1) 
and subject='physics'

以上查询工作正常。但我想要不同的解决方案,其中我不必两次扫描同一个表

我还尝试使用Rank()Row_Number(),但没有结果。

仅供参考:

我给你看了一个例子,这不是我正在玩的实际表,我的表包含大量的行和列,where子句也很复杂(即日期比较等),所以我不想在子查询和outquery中给出相同的where子句。

2 个答案:

答案 0 :(得分:1)

另一种选择是使用分析函数:

select sid, tid, subject from
(
select sid, tid, subject, count(sid) over (partition by subject, tid) cnt
from tabletesting
) X 
where cnt = 1

答案 1 :(得分:1)

您可以使用窗口功能执行此操作。假设给定教师没有重复的学生(如您的样本数据):

select tt.sid, tt.tid 
from (select tt.*, count(*) over (partition by teacher) as scnt
      from TableTesting tt
     ) tt
where scnt = 1;

另一种可能更有效的方法是使用exists子句:

select tt.sid, tt.tid
from TableTesting tt
where not exists (select 1 from TableTesting tt1 where tt1.tid = tt.tid and tt1.sid <> tt.sid)