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

连回3贴都是错的(不能继续发回复了),只能在这儿重开一贴把我觉得正确的补上
原贴内容:

目前碰到一个查询不会写,表结构是这样的

表A Id Name
1 李三
2 小明
3 林明
表B Id 表AID content grade
1 1 钢琴 二级
2 1 英语 一级
3 2 骑马 一级
4 3 英语 三级
5 3 数学 三级
6 3 钢琴 五级
7 1 骑马 一级

想查询出同时拥有 钢琴二级和英语一级的同学姓名,查询语句如何写呢?


查询结果

Name content grade
李三 钢琴 二级
李三 英语 一级


补充回复:

见一楼

------解决方案--------------------
这句有什么问题?
SQL code
if(OBJECT_ID('a') is not null) drop table a
GO
create table a (Id int, name varchar(10))
insert into a values(1, '李三')
insert into a values(2, '小明')
insert into a values(3, '林明')
if(OBJECT_ID('[b]') is not null) drop table b
GO
create table b (Id int,AID int,content varchar(10), grade varchar(10))
insert into b values(1 ,1 ,'钢琴', '二级')
insert into b values(2 ,1 ,'英语', '一级')
insert into b values(3 ,2 ,'骑马', '一级')
insert into b values(4 ,3 ,'英语', '三级')
insert into b values(5 ,3 ,'数学', '三级')
insert into b values(6 ,3 ,'钢琴', '五级')
insert into b values(7 ,1 ,'骑马', '一级')
insert into b values(8,2,'英语', '一级')
insert into b values(9,2,'钢琴', '二级')

go

select t1.name,t2.content,t2.grade
from a t1 join b t2 on t1.id=t2.aid
where exists(select 1 from b where content='钢琴' and grade='二级' and aid=t2.aid)
and exists(select 1 from b where content='英语' and grade='一级' and aid=t2.aid)
and t2.content in ('钢琴','英语')
go
/*
name       content    grade      
---------- ---------- ---------- 
李三         钢琴         二级
李三         英语         一级
小明         英语         一级
小明         钢琴         二级

(所影响的行数为 4 行)
*/

------解决方案--------------------
每次都得等着Google的广告load完成。
------解决方案--------------------

------解决方案--------------------
探讨
想查询出同时拥有 钢琴二级和英语一级的同学姓名,查询语句如何写呢?……

查询结果

Name content grade
李三 钢琴 二级
李三 英语 一级

------解决方案--------------------
帮顶。