Re: [SQL ] (考題類)查詢的問題
>> (一)列出曾借閱「遠流」出版的書的所有員工的姓名。(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
→
09/09 01:55, , 1F
09/09 01:55, 1F
→
09/09 01:59, , 2F
09/09 01:59, 2F
→
09/09 02:00, , 3F
09/09 02:00, 3F
討論串 (同標題文章)