SELECT     书籍信息.书籍名称, 书籍信息.出版社名称
FROM         书籍信息
WHERE     书籍信息.书籍编号 = ALL
                          (SELECT     书籍编号
                            FROM          借还书信息
                            WHERE      读者编号 =
                                                       (SELECT     读者编号
                                                         FROM          读者信息
                                                         WHERE      读者姓名 = '张三'))
INTERSECT
SELECT     书籍信息.书籍名称, 书籍信息.出版社名称
FROM         书籍信息, 书籍类别
WHERE     书籍信息.书籍类别 = 书籍类别.类别编号 AND 书籍类别.类别名称 = '自然科学类'
(问题:查询张三借阅过的全部’自然科学类’书籍名称和出版社名称)
上述语句错在哪,在SQL SERVICE2005上搞了很久就是没结果,各位帮帮忙咯

解决方案 »

  1.   

    原句改,不过不用这么复杂:
    SELECT 书籍信息.书籍名称, 书籍信息.出版社名称
    FROM 书籍信息
    WHERE 书籍信息.书籍编号 in
      (SELECT 书籍编号
      FROM 借还书信息
      WHERE 读者编号 =
      (SELECT 读者编号
      FROM 读者信息
      WHERE 读者姓名 = '张三'))
    INTERSECT
    SELECT 书籍信息.书籍名称, 书籍信息.出版社名称
    FROM 书籍信息, 书籍类别
    WHERE 书籍信息.书籍类别 = 书籍类别.类别编号 AND 书籍类别.类别名称 = '自然科学类'
      

  2.   

    select 书籍信息.书籍名称, 书籍信息.出版社名称
    from 书籍信息, 书籍类别
    WHERE 书籍信息.书籍类别 = 书籍类别.类别编号 AND 书籍类别.类别名称 = '自然科学类'
    and 书籍信息.书籍编号 in
      (SELECT 书籍编号
      FROM 借还书信息
      WHERE 读者编号 =
      (SELECT 读者编号
      FROM 读者信息
      WHERE 读者姓名 = '张三'))
      

  3.   

    --4张表:书籍信息/书籍类别/借还书信息/读者信息
    SELECT  A.书籍名称 ,
            A.出版社名称
    FROM    书籍信息 A
            Inner JOIN 书籍类别 B ON A.书籍类别 = B.类别编号
            Inner JOIN 借还书信息 C ON A.书籍编号 = C.书籍编号
            Inner JOIN 读者编号 D ON C.读者编号 = D.读者编号
    WHERE   B.类别名称 = '自然科学类'
            AND D.读者姓名 = '张三'
      

  4.   

    --4张表:书籍信息/书籍类别/借还书信息/读者信息--改动一下
    --也可
    SELECT  A.书籍名称 ,
            A.出版社名称
    FROM    书籍信息 A
            Inner JOIN 借还书信息 B ON A.书籍编号 = B.书籍编号
            where exist(select 1 from 读者编号 D where  B.读者编号 = D.读者编号 and D.读者姓名 = '张三') and 
            exist(select 1 from 书籍类别 C where  A.书籍类别 = C.类别编号 and C.类别名称 = '自然科学类'')