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 
各位还有没其它答案????有的话最好注释一下

解决方案 »

  1.   

    怎么觉着这个语句有点问题!select cno from
    (
      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
      

  2.   

    SELECT a.CNO 
    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.   

    lz你的SQL有问题,如果一个人借了两次同一本书也会被查出来,比如借了两次"计算方法" ,因为你只管借了两次的。
    还有借了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 
      

  4.   


    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