日期:2014-05-18  浏览次数:20487 次

请教怎么实现这个查询
姓名 科目 成绩
小明 英语 97
小明 数学 82
小红 英语 100
小刚 英语 83
小刚 化学 67

希望查询所有没有考过数学的同学的英语成绩

结果为

小红 英语 100
小刚 英语 83


------解决方案--------------------
SELECT * FROM 表 WHERE (姓名=(SELECT * FROM 表 where 科目<>'数学' ))and (科目='英语')
------解决方案--------------------
刚刚测试了NOT IN 和NOT EXISTS 的速度, 发现NOT EXISTS 要比 NOT IN 快的多, 不知道对不对?

以下是测试例子:

-- generate the temporal table
create table #table
(id1 INT, id2 INT, value int)

set nocount on
declare @i1 int, @i2 int
set @i1 = 300
SEt @i2 = 300

while @i1>0
Begin
while @i2 > 0
Begin
insert #table
values(@i1, @i2, @i1*@i2)
set @i2 = @i2-1
End
set @i2 = @i1
set @i1 = @i1-1
end

-- truncate table #table
-- select * from #table


-- testing
declare @a DateTime, @b DateTime

set @a = Current_TimeStamp
select * from #table where id2 = 1 and id1 not in (select id1 from #table where id2 = 99)
set @b = current_TimeStamp
select DateDiff(ms, @a, @b), @a, @b


set @a = Current_TimeStamp
select * from #table t where id2 = 1
AND NOT Exists (
select 1 from #table where id2 = 99 and id1 = t.id1)
set @b = current_TimeStamp
select DateDiff(ms, @a, @b), @a, @b