请教高手解答
CREATE TABLE member(
MID CHAR(10) PRIMARY KEY, --学号
MNAME CHAR(50) NOT NULL --姓名
)
CREATE TABLE F(
FID CHAR(10) PRIMARY KEY, --课程
FName CHAR(50) NOT NULL --课程名
)
CREATE TABLE Score(
SID INT PRIMARY KEY IDENTITY(1,1), --成绩记录号
FID CHAR(10) FOREIGN KEY(FID) REFERENCES F(FID), --课程号
MID CHAR(10) FOREIGN KEY(MID) REFERENCES member(MID), --学生号
Score INT NOT NULL --成绩
)
这是我建立的表的脚本,我要实现下面的查询
姓名 英语 数学 语文 历史
我下面这条SQL语句的意思就是 先选出来姓名,然后分别select4列,通过F001
,F002这些用来区分课程,sMID=mMID
SELECT 姓名=(SELECT m1.MName from member AS m1),
英语=(select Score from Score as s where s.FID='F001'AND s.MID=m.MID)
--数学=(select Score from Score AS s where s.FID='F002')
--语文=(select Score from Score AS s where s.FID='F003' WHERE member.MID=s.SID),
--历史=(select Score from Score AS s where s.FID='F004' WHERE member.MID=s.SID)
FROM Score AS s,member AS m,F AS f
但是执行的时候老是提示
子查询返回的值不止一个。当子查询跟随在 =、!=、<、<=、>、>= 之后,或子查询用作表达式时,这种情况是不允许的。
我思路上看不出来问题啊,但是这个问题折腾了好久,自学真心痛苦啊。请高人能按着我的思路解答下,应为有更容易的实现这个的方法,但是我还是想知道我自己的思路错在那里了,谢谢
想用子查询,应该先确定主表,你想查“姓名 英语 数学 语文 历史”,主表肯定应该是人,也就是出的结果应该是一个人一行记录,主题sql就是
select name from member;然后成绩采用子查询:(select Score from Score as s where s.FID='F001'AND s.MID=m.MID);综合起来就是
select name,(select Score from Score as s where s.FID='F001'AND s.MID=m.MID) from member;
你写的sql问题就在于:1、主sql from 应该只有member表,2、姓名=(SELECT m1.MName from member AS m1),这个子查询不需要,而且这个子查询的结果是所有人的肯定是多条记录
没看明白你想要的结果什么?你是要统计每门课程每个学生的成绩么?
数学为什么不加上 member.MID=s.SID?每个学生只有一门数学的
首先要定位问题,子查询返回的结果只能是一条数据,而你的一个姓名可能对应多门课程;
left join 三表联查
大概就是这个样子,你自己再调整一下
select MID as 学号,
name as 姓名,
sum(case
when subject = '语文' then
score
else
0
end) as 语文,
sum(case
when subject = '数学' then
score
else
0
end) as 数学,
sum(case
when subject = '历史' then
score
else
0
end) as 英语,
sum(score) as 总分
from member a left join
Score b on a.mid=b.mid
left join FROM F
c on b.fid=c.fid
group by mid,
name order by 总分desc