我正在寻找优化查询
让我向您展示一个小例子。
让我假设我有一个表有三个字段studentId, teacherId and subject
作为
现在我想要一个物理老师只教一个学生的数据,即
老师 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子句。
答案 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)