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

求一SQL语句,,是一道面试题,自已想了一下午,求解!
学生表
学生ID     学生姓名


科目表
科目ID     科目名称


成绩表
ID     学生ID     科目ID     成绩


成绩表中存的是已考试的所有学生所有科目的成绩

求未参加考试的学生,和他们未考的科目,(也就是成绩表中没有的学生和没有的科目)如下:

学生姓名   未考科目名称

------解决方案--------------------
select *
from 学生表 a
left join 科目表 b on 1=1
left join 成绩表 c on a.学生ID = c.学生ID and b.科目ID = c.科目ID
where c.id is null

------解决方案--------------------
select 学生表.学生姓名 , 科目表.科目名称
from 学生表 cross join 科目表
where cast(学生表.学生姓名 as varchar) + cast(科目表.科目名称 as varchar)
not in
(
select cast(学生表.学生姓名 as varchar) + cast(科目表.科目名称 as varchar)
from 学生表,科目表,成绩表
where 成绩表.学生ID = 学生表.学生ID and 成绩表.科目ID = 科目表.科目ID
)
------解决方案--------------------
--有点小错
select *
from 学生表 a
cross join 科目表 b
left join 成绩表 c on a.学生ID = c.学生ID and b.科目ID = c.科目ID
where c.id is null

------解决方案--------------------
cast(学生表.学生姓名 as varchar) + cast(科目表.科目名称 as varchar)

这种写法不健壮

'ab '+ 'cd ' = 'a ' + 'bcd '
------解决方案--------------------
根据楼上的数据
select d.stname,e.suname from student a cross join subject b left join grade c on a.stid=c.stid and b.suid=c.suid left join student d on a.stid=d.stid
left join subject e on b.suid=e.suid where grade is null