如何返回sql如下数据集?急需!!!
设有如下表,字段的含义分别为学生姓名、课程、成绩。其中课程只有三门:数学、语文、物理,姓名和课程是联合主键。表名:table1studentcoursemark张三数学8...
设有如下表,字段的含义分别为学生姓名、课程、成绩。其中课程只有三门:数学、语文、物理,姓名和课程是联合主键。
表名:table1
student course mark
张三 数学 80
张三 语文 85
张三 物理 88
李四 数学 90
......
要求用sql返回如下数据集:
姓名 数学 语文 物理
张三 80 85 88
李四 90 ... ... 展开
表名:table1
student course mark
张三 数学 80
张三 语文 85
张三 物理 88
李四 数学 90
......
要求用sql返回如下数据集:
姓名 数学 语文 物理
张三 80 85 88
李四 90 ... ... 展开
3个回答
展开全部
使用自链或是临时表就可以了!
二楼,这样的表怎么不符合3NF了?这样表的关系依赖是(student,course)->mark,为什么说他不符合第三范式?我看符合的很呢!
自连接正如一楼所写,但一楼的结果是否正确就不敢保证的。因为必须考虑的是某一个学生在某一科没有成绩的情况。比如李四没有语文的成绩,注意不是语文成绩是0或null,而是没有这条记录时,一楼的语句是否还能正确的得出李四的结果?
seelct a.student,a.mark,b.mark,c.mark from table1 a join table1 b on a.student = b.student,table1 b join table1 c on b.student = c.student where a.course = '语文' and b.course = '数学' and c.course ='物理'
中间三表连接条件,如果写了前两具,则不必再说第三个,因为那是多余的。
临时表只是一个中间过程,实际在SQL中,视图,表,语唏,存储过程没有区别的。
select a.student,a.mark,b.mark,c.mark from (select a.student,a.mark from table1 a where a.course='语文'),(select b.student,b.mark from table1 b where b.course='数学'),(select c.student,c.mark from table1 c where c.course='语文') where a.student=b.student and a.student = c.student
也不是不必写b.student = c.student的。
如果烦麻烦,将from后的三个select改写成临时表或是视图就可以了!
重审一下就是该表符合3NF,如果有些结果出不来的时间,连接条件变成全连接即可!
一楼代码的主要缺点可能就是会引起不一致性的。虽然变成全连接可以得到结果,但第一个人的顺序可能是“语文、数学、物理”,但到第二个就可能是“语文,物理,数学”不同的顺序,难易达到一定的顺序对应的!所以一楼代码正确,但没有实用性!
二楼,这样的表怎么不符合3NF了?这样表的关系依赖是(student,course)->mark,为什么说他不符合第三范式?我看符合的很呢!
自连接正如一楼所写,但一楼的结果是否正确就不敢保证的。因为必须考虑的是某一个学生在某一科没有成绩的情况。比如李四没有语文的成绩,注意不是语文成绩是0或null,而是没有这条记录时,一楼的语句是否还能正确的得出李四的结果?
seelct a.student,a.mark,b.mark,c.mark from table1 a join table1 b on a.student = b.student,table1 b join table1 c on b.student = c.student where a.course = '语文' and b.course = '数学' and c.course ='物理'
中间三表连接条件,如果写了前两具,则不必再说第三个,因为那是多余的。
临时表只是一个中间过程,实际在SQL中,视图,表,语唏,存储过程没有区别的。
select a.student,a.mark,b.mark,c.mark from (select a.student,a.mark from table1 a where a.course='语文'),(select b.student,b.mark from table1 b where b.course='数学'),(select c.student,c.mark from table1 c where c.course='语文') where a.student=b.student and a.student = c.student
也不是不必写b.student = c.student的。
如果烦麻烦,将from后的三个select改写成临时表或是视图就可以了!
重审一下就是该表符合3NF,如果有些结果出不来的时间,连接条件变成全连接即可!
一楼代码的主要缺点可能就是会引起不一致性的。虽然变成全连接可以得到结果,但第一个人的顺序可能是“语文、数学、物理”,但到第二个就可能是“语文,物理,数学”不同的顺序,难易达到一定的顺序对应的!所以一楼代码正确,但没有实用性!
展开全部
建的表就不符合三个范式 你这样建的表不仅冗余度大还造成你现在查询犯难 为什么建表的时候不建成:姓名、数学成绩、语文成绩、物理成绩
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2010-12-07
展开全部
select a.student,a.remark,b.remark,c.remark from table1 a,table1 b,table1 c
where a.student=b.student and b.student=c.student and a.course !=b.course and a.course !=c.course and b.course !=c.course ;
where a.student=b.student and b.student=c.student and a.course !=b.course and a.course !=c.course and b.course !=c.course ;
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询