作者tedcat (动静:MSN昵称为主)
看板Database
标题Re: [SQL ] (考题类)查询的问题
时间Sun Sep 9 01:51:48 2012
>> (一)列出曾借阅「远流」出版的书的所有员工的姓名。(10分)
>> (二)列出曾借阅
所有「远流」出版的书的所有员工的姓名。(10分)
第二题 要找出 哪些员工 曾经借过 所有远流出版的书
所以远流出过几本书,那麽,那个员工就要借过所有书...
所以,首先,
1.找出所有远流出版的书
select 书本.书本编号
from 书本
where 出版商='远流'
2.找出哪些员工借了全部远流的书看过,
这边常用的有两种方式:
a.用except比对结果集
(把各员工借过的远流书 跟远流全部书 做except),
b.用书本笔数方式判定
(远流出过n本书,那麽各员工借过的远流书本编号的数目要相等)
[当然要distinct过借书记录的书本编号]
在这边我使用书本数目来决定跟比对:
select 借书记录.员工编号
from (select distinct 员工编号,书本编号 from 借书记录) as 借书记录A
join 书本 on 借书记录A.书本编号=书本.书本编号
where 书本.出版商='远流'
group by 借书记录A.员工编号
having count(*)=(
select count(distinct 书本.书本编号)
from 书本
where 出版商='远流'
)
3.对回去员工姓名
: : (二)
: : Select 姓名
: : From 员工
: : Where Not Exists ((Select 书本.书本编号
: : From 书本
: : Where 出版商='远流' )
: : EXCEPT
: : (Select 借书记录.书本编号
: : From 借书记录,书本
: : Where 员工.员工编号 = 借书记录.员工编号
: : AND 借书记录.书本编号 = 书本.书本编号
: : AND 出版商= '远流'
: : ))
你这边错误的地方有几个,
1.子叙述:
a.因为except後的结果是 哪些书从没被任何员工借过...
b.必须先依据各员工做group,才知道各员工的借书状况,
然後才针对各员工与远流书做比较.
2.你的子叙述取到的只有书本编号,所以怎麽可能跟员工比的到结果....
: : (三)
: : Select 姓名
: : From 员工
: : Where (Select COUNT(*)
: : From 借书记录,书本
: : Where 员工.员工编号 = 借书记录.员工编号
: : AND 借书记录.书本编号 = 书本.书本编号
: : AND 出版商= '远流') >= 5 );
其实这题也犯了上述2.的错误...
: : --
: : ◆ From: 111.246.163.136
: : 推 Adonisy:你还要考虑,要用 ansi sql来写 08/27 16:21
: : → Adonisy:而且你的题目好像不对 08/27 16:23
: : → tedcat:2不对...要先把远流所有书找到後,再找哪个员工借过全部 08/29 01:23
: 抱歉...题目就是这个没错,这不是高特考题目
: 然後有大大可以解释我第二题哪错了吗?
--
欢迎参观我的相簿
http://www.pixnet.net/tedcat
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 220.229.71.5
2F:→ tedcat:或是常见的 请找出修过XXX老师全部课程的所有学生与其名字 09/09 01:59
3F:→ tedcat:是一样道理的 09/09 02:00