sql server三表操作
三个关系表:
CARD 借书卡。 CNO 卡号,NAME 姓名,CLASS 班级
BOOKS 图书。 BNO 书号,BNAME 书名,AUTHOR 作者,PRICE 单价,QUANTITY 库存册数
BORROW 借书记录。 CNO 借书卡号,BNO 书号,RDATE 还书日期查询当前同时借有"计算方法"和"组合数学"两本书的读者,输出其借书卡号,并按卡号升序排序输出
--实现代码:
SELECT a.CNO
FROM BORROW a,BOOKS b
WHERE a.BNO=b.BNO
AND b.BNAME IN(N'计算方法',N'组合数学')
GROUP BY a.CNO --解释一下这一句
HAVING COUNT(*)=2 --解释一下这一句
ORDER BY a.CNO DESC
各位还有没其它答案????有的话最好注释一下
三个关系表:
CARD 借书卡。 CNO 卡号,NAME 姓名,CLASS 班级
BOOKS 图书。 BNO 书号,BNAME 书名,AUTHOR 作者,PRICE 单价,QUANTITY 库存册数
BORROW 借书记录。 CNO 借书卡号,BNO 书号,RDATE 还书日期查询当前同时借有"计算方法"和"组合数学"两本书的读者,输出其借书卡号,并按卡号升序排序输出
--实现代码:
SELECT a.CNO
FROM BORROW a,BOOKS b
WHERE a.BNO=b.BNO
AND b.BNAME IN(N'计算方法',N'组合数学')
GROUP BY a.CNO --解释一下这一句
HAVING COUNT(*)=2 --解释一下这一句
ORDER BY a.CNO DESC
各位还有没其它答案????有的话最好注释一下
(
select a.*
from borrow a inner join books b
on a.bno = b.bno
where b.bname in ('计算方法','组合数学')
) a group by cno
having count(cno) = 2
FROM BORROW a,BOOKS b
WHERE a.BNO=b.BNO
AND b.BNAME IN(N'计算方法',N'组合数学')
GROUP BY a.CNO --解释一下这一句:在group by前选出的是借阅了计算方法或者组合数学的卡号
HAVING COUNT(*)=2 --解释一下这一句:having就筛选除了,在选出的记录中,选了2本书的卡号
ORDER BY a.CNO DESC
因为第一步选出的记录只是选择了2本规定书中1本或2本的记录,然后通过分组再选出同一卡号但借阅了2本书的情况就是即选择计算方法又选组合数学的卡号了.
为了提高效率楼主的代码可以这样改改,当记录比较多是就能看出比楼主给出的方法优越:
select cno
from
(
select
a.cno
from
borrow a
inner join
books b
on
a.bno = b.bno
where
b.bname in ('计算方法','组合数学')
group by
cno
having
count(cno) = 2
) a
order by
cno
还有借了3次以上的查不出来,比如(两次 "计算方法" + 1次"组合数学"),这样应该也符合条件的。select CNO from
(SELECT a.CNO,a.BNO
FROM BORROW a,BOOKS b
WHERE a.BNO=b.BNO
AND b.BNAME IN(N'计算方法',N'组合数学')
GROUP BY a.CNO,a.BNO) T --先把同一本书借了多次这种情况合并为一条记录
goup by CNO --按借书号合并记录,如果借了两本书就会出现COUNT(*)=2,否则COUNT(*)=1
HAVING COUNT(*)=2 --只取COUNT(*)=2 的记录
ORDER BY CNO DESC
select cno from
(
select a.*
from borrow a inner join books b
on a.bno = b.bno
where b.bname in ('计算方法','组合数学') and RDATE is null
) a group by cno
having count(cno) = 2