首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

求一SQL语句,是一道面试题,自已想了一下午,求解!该怎么处理

2012-01-30 
求一SQL语句,,是一道面试题,自已想了一下午,求解!学生表学生ID学生姓名科目表科目ID科目名称成绩表ID学生I

求一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

热点排行