注册 登录
编程论坛 SQL Server论坛

[求助]如何实现这种多表查询结果?

jockey 发布于 2007-05-11 12:37, 908 次点击
A、B、C、D四个表,表结构及记录如下:

A:id,姓名,性别
1 王某 男
2 李某 男

B:Aid,课程,得分
1 历史 80
2 政治 90
1 政治 75

C:Aid,宿舍
1 801#

D:Aid,出勤
2 满勤

我想通过查询姓名为“王某”的一些情况: 姓名-课程-得分-宿舍-出勤

select A.姓名,B.课程,B.得分,C.宿舍,D.出勤 from A,B,C,D where B.Aid=A.id and C.Aid=A.id and D.Aid=A.id

查询的结果为 空,看了一下主要原因是D表中没有Aid为1的纪录。
我想实现的结果为(课程、得分超过1条纪录则合并):

姓名 课程 得分 宿舍 出勤
王某 历史、政治 155 801#

如果查询"李某"结果如下:
姓名 课程 得分 宿舍 出勤
李某 政治 90 满勤



9 回复
#2
bruce2007-05-11 13:59
D表中没有1的ID 当然查不到
#3
bruce2007-05-11 14:01

A:id,姓名,性别
1 王某 男
2 李某 男

B:Aid,课程,得分
1 历史 80
2 政治 90
1 政治 75

C:Aid,宿舍
1 801#
2 NULL

D:Aid,出勤
1 NULL
2 满勤

#4
jockey2007-05-11 14:06
谢谢!
但是D表中我不想出现这个纪录 1 NULL

有什么办法么?
#5
棉花糖ONE2007-05-11 16:07
if object_id('dbo.fn_c') is not null
drop function dbo.fn_c
go
create function dbo.fn_c(@id int)
returns varchar(200)
as
begin
declare @a varchar(20)
select @a=''
select @a=@a+课程+',' from b where aid=@id
select @a=left(rtrim(@a),len(rtrim(@a))-1)
return @a
end
go
select 姓名,dbo.fn_c(t.id) as 科目,宿舍,出勤,sum(score) as 成绩 from
(select id,A.姓名,B.课程,B.得分 as score,C.宿舍,D.出勤 from A,B,C,D where B.Aid=A.id and C.Aid=A.id and D.Aid=A.id) as t
group by 姓名,宿舍,出勤,id
#6
jockey2007-05-11 17:30
马上就试试
#7
jockey2007-05-11 22:12
相当感谢棉花糖ONE!问题解决!

看来sql要学的东西相当多啊,努力!
#8
jockey2007-05-11 23:05

棉花糖ONE斑竹大人:
但是D表中如果没有纪录: 1 NULL
则,显示的数据就少了一条
where B.Aid=A.id and C.Aid=A.id and D.Aid=A.id) as t


我的意思是,C库、D库有值则取值,没有值但不影响

比如:我想列出如下内容:

id 姓名 性别 课程 得分 宿舍 出勤
1 王某 男 历史、政治 155 801#
2 李某 男 政治 90 满勤

但是如果加上这个条件:B.Aid=A.id and C.Aid=A.id and D.Aid=A.id就可能查询结果为空了!

#9
棉花糖ONE2007-05-12 13:52
这样的话不能用内连接,要改成外联接,左联接或者右连接
#10
Kendy1234562007-05-14 17:48
用left join就ok

1